IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

matrice à partir d'une autre avec un test


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 109
    Points : 63
    Points
    63
    Par défaut matrice à partir d'une autre avec un test
    Bonjour,

    Je récupère la matrice suivante (dont la taille peut varier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1	1	2	1	1	4	5	2	4	2	3	2
    2	1	2	2	2	4	3	3	2	0	0	0
    3	3	-30	0	0	0	0	0	0	0	0	0
    4	0	43	3	1	3	3	2	2	2	1	2
    5	0	0	0	0	0	0	0	0	0	0	0
    6	44	-69	1	1	0	1	0	1	0	-3	5
    7	45	-35	45	-19	12	5	11	0	7	2	8
    sur laquelle je souhaiterais récupérer la valeur moyenne par ligne en testant chaque ligne!

    En effet:
    -si une ligne ne comporte que des zéros (ligne 5) ou trop de zéros (ligne 3);je ne veux pas la prendre en compte
    - si elle comporte peu de zéros (ligne n°2, 4 et 6) je souhaite faire la moyenne sur les valeurs non nulles

    Par ailleurs, si une valeur a un trop grand écart avec les autres je souhaiterais ne pas en tenir comptes dans mes moyennes (résultats faussés) comme la 2ème valeur dans la 4ème ligne ou ligne 6. Comment-dois je m'y prendre?

    Merci d'avance de votre aide

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Bonjour,
    En supposant que ta matrice s'appelle M.

    - Tester si une ligne n'a que des zéros, ça c'est facile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if all(M(i,:)==0) %où i est l'indice de la ligne courante
    - Tester s'il y a "trop" de zéros, c'est subjectif, que veux dire "trop" ? Il faut alors tester combien il y a de zéros et s'il y en a plus qu'un seuil à fixer dire qu'on passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if length(find(M(i,:)==0))>seuil %c'est surement "optimisable"
    - Faire la moyenne sur les valeurs non nulles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ligne=M(i,:);
    mean(ligne(ligne~=0));
    - Valeur ayant un "trop" grand écart : pareil il faut définir dans ce cas ce que veut dire "trop"
    Règles du Forum

    Adepte de la maïeutique

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Tout d'abord merci, car j'avoue je n'y arrivais pas!

    Alors pour le trop de 0, si j'ai plus de 70% de zéros dans ma ligne (donc 70% du nombre de colonnes) je veux exclure les lignes

    Et sinon, valeur ayant un trop grand écart, je ne sais pas encore mais je voulais utiliser l'écart type ou quelque chose dans le genre, le problème est que dans ce cas, je vais tout de même prendre toutes les valeurs d'une ligne pour faire ce calcul et écarter les valeurs trop différentes. Peut-être avez-vous d'autres idées pour cela!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if all(M(i,:)==0) && length(find(M(i,:)==0))>0.7*N
        disp('')
    else
        v1=mean(M,2)*2*pi()/(180*ti*Veff); 
    end
    me renvoie un vecteur mais il ya des 0.... donc ne prend pas en compte le if!

    Merci encore

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Citation Envoyé par lilyla Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if all(M(i,:)==0) && length(find(M(i,:)==0))>0.7*N
        disp('')
    else
        v1=mean(M,2)*2*pi()/(180*ti*Veff); 
    end
    me renvoie un vecteur mais il ya des 0.... donc ne prend pas en compte le if!
    Sur ton test c'est un OU (||) qu'il faut mettre, pas un ET (&&) car là il ne rentrera dans le if que si tous les éléments sont à zéro.
    D'ailleurs tu peux te passer du test "Si tous les éléments sont zéros" car cette condition rentre dans le cas "Si il y a plus de 70% de zéros".
    Donc tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if length(find(M(i,:)==0))>0.7*N
        disp('trop de zéros...')
    else
        v1=mean(M,2)*2*pi()/(180*ti*Veff); 
    end
    Et tu n'as pas non plus utilisé la méthode pour enlever les zéros dans le cas où il y en a moins de 70%...
    Règles du Forum

    Adepte de la maïeutique

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Re-bonjour,

    Voici pour l'instant un bout de code qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var=0; i=1;
    while (var==0)
        if length(find(M(i,:)==0))>0.3*N  
            M(i,:)=[];
            i=i-1;
        end
        [nl nc]=size(M);
        if(i==nl)
            var=1;
        end
        i=i+1;
    end
    Je souhaiterais rejouter à ces lignes (comme je le souhaitais déjà), un test permettant de faire la moyenne sur chaque ligne en excluant les zéros et les valeurs présentant un trop grand écart avec les autres

    Merci d'avance pour tous vos suggestions et avis
    Cordialement,

  6. #6
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    D'abord ton code me parait faux : il manque la définition de ecart1 (qui doit être M je suppose) et i ne devrait pas commencer à 1 sinon quand tu le décrémentes (i=i-1) ça va planter.
    Et tu es passé de 70% à 30%, c'est normal ?

    Je te propose une petite amélioration de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ecart1=M;%hypothèse ?
    [nl nc]=size(M);
    for i = nl:-1:1 %on boucle sur les lignes de M en partant du "bas"
        if length(find(M(i,:)==0))>0.3*nc %S'il y a plus de 30% de zéros dans la ligne
            ecart1(i,:) = [];%on enleve cette ligne de ecart1
        end    
    end
    Et pour la moyenne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=1:size(ecart1,1)
       maLigne=ecart1(i,:);
       maLigne(maLigne==0)=[];%enleve les zéros de la ligne
       %faire ici le calcul sur maLigne
    end
    Règles du Forum

    Adepte de la maïeutique

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    En fait si je commence à i=0 je vais rencontrer un problème... et j'ai besoin de faire i=i-1 pour ne pas sauter de ligne dans ma matrice quand je supprime toute une ligne de 0; Et par chance quand i=1, je n'avais pas une ligne à supprimer (mais cela pourrait m'arriver donc à changer avec ta technique en décrementatn cela devrait fonctionner ?)

    Sinon, oui j'avais inversé les 30 et 70% ...

    Par ailleurs, sur toute la matrice M, on voit bien que certaines valeurs (>20) ne sont pas en accord. Je voudrais pouvoir faire un calcul sur toutes les données de ma matrice afin d'en déterminer une valeur critique au-delà de laquelle je ferais comme quand j'ai des zéros dans ma ligne afin de ne pas les prendre en compte!

    En tout cas, merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Sous matrice à partir d'une autre matrice
    Par RedShady dans le forum MATLAB
    Réponses: 2
    Dernier message: 20/12/2014, 07h44
  2. Réponses: 1
    Dernier message: 20/05/2014, 10h51
  3. [Débutant] créer une matrice à partir de 2 autres de tailles différentes
    Par chevalvapeur dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/12/2009, 15h57
  4. ajout ligne avec donnée dans msflexgrid à partir d'une autre form
    Par bastos77 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/03/2009, 18h08
  5. [JUnit] [junit 4] Tests automatique à partir d'une autre classe
    Par Periph dans le forum Tests et Performance
    Réponses: 9
    Dernier message: 28/03/2007, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo