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 :

impossible d'incrémenter dans une boucle for


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 40
    Points
    40
    Par défaut impossible d'incrémenter dans une boucle for
    Bonjour,

    Le but de la boucle for ci-dessous est de parcourire le vecteur VecteurValidite et de compter le nombre des B2,B3,C1,C2 et >C2 en incrémentant des variables ,

    Le problème que je rencontre est que je n'arrive à incrémenter aucune des variables conrrespondant aux B2,B3,..
    Le code à l'aire d'etre correct, j'ai vérifié on rentre bien dans le FOR.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            for i=1:TailleVecteurSurface
                if (strcmp(VecteurValidite(i,:), 'B2') ==  1 )
                    NbDefautsB2=(NbDefautsB2+1);
                elseif (strcmp(VecteurValidite(i,:), 'B3') ==  1 )
                    NbDefautsB3=(NbDefautsB3+1);
                elseif (strcmp(VecteurValidite(i,:), 'C1') ==  1 )
                    NbDefautsC1=(NbDefautsC1+1);
                elseif (strcmp(VecteurValidite(i,:), 'C2') ==  1 )
                    NbDefautsC2=(NbDefautsC2+1);
                elseif (strcmp(VecteurValidite(i,:), '>C2') ==  1 )
                    NbDefautsC2sup=(NbDefautsC2sup+1);
                end 
            end
    Voici un exemple du vecteur contenant les B2,B3,C1,C2,>C2.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    VecteurValidite=
    B2
    B3
    C2
    B2
    B2
    >C2
    C1
    B3
    >C2
    >C2

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Salut,

    Comment as-tu crée VecteurValidite?

    Pour info tu n'as pas besoin de passer par le test '==1', strcmp renvoie déjà une valeur logique.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juin 2009
    Messages : 53
    Points : 57
    Points
    57
    Par défaut
    SAlut,
    dans l'aide il est spécifié la remarque suivante : "TF = strcmp('str', C) compares string str to the each element of cell array C, where str is a character vector (or a 1-by-1 cell array) and C is a cell array of strings."
    As-tu vraiment un tableau dont les cellules sont des chaines de caractères ?? Si oui, ne faudrait-il pas mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(VecteurValidite{i,:}, 'B2') ...
    par hasard... (pareil pour les autres).
    D'ailleurs, apparemment tu peux même te contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if strcmp(VecteurValidite,'B2')
    ...
    elseif strcmp(VecteurValidite,'B3')
    ...
    ...
    bon courage.

  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
    Il faudrait effectivement savoir exactement ce qu'est VecteurValidite :
    - Tableau de char ou de cell
    - Dans le cas d'un tableau de char sa taile

    Donc un petit :
    nous permettra de t'aider.

    Je peux déjà te dire que tes IF/ELSEIF ne serviront pas
    Tu devrais utiliser par exemple STRMATCH.
    Et redéfinir tes NbDefauts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    compare = {'B1','B2',...}
    NbDefauts = zeros(size(compare);%NbDefauts(1) correspond à B&, (2) à B2, etc...
    for ..
    ind = strmatch(VecteurValidite(i,:),compare);
    NbDefauts(ind) = NbDefauts(ind)+1;
    end

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Bonjour à tous,

    le vecteur VecteurValidite contient uniquement des char, voici ce que renvoi whos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    whos VecteurValidite
     
      Name                 Size            Bytes  Class    Attributes
     
      VecteurValidite      4x7                56  char     global

    J'ai essayé ce code, mais toujours aucune incrémentation de NbDefauts(ind) ni de ind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            compare = {'B2','B3','C1','C2','>C2'};
            NbDefauts = zeros(size(compare));
            for i=1:TailleVecteurValidite
            ind = strmatch(VecteurValidite(i,:),compare);
            NbDefauts(ind) = NbDefauts(ind)+1;
            end

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Klinnmas Voir le message
    SAlut,
    dans l'aide il est spécifié la remarque suivante : "TF = strcmp('str', C) compares string str to the each element of cell array C, where str is a character vector (or a 1-by-1 cell array) and C is a cell array of strings."
    As-tu vraiment un tableau dont les cellules sont des chaines de caractères ?? Si oui, ne faudrait-il pas mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(VecteurValidite{i,:}, 'B2') ...
    par hasard... (pareil pour les autres).
    D'ailleurs, apparemment tu peux même te contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if strcmp(VecteurValidite,'B2')
    ...
    elseif strcmp(VecteurValidite,'B3')
    ...
    ...
    bon courage.
    salut,

    avec ce code et sans la boucle for toujours aucune incrémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                if (strcmp(VecteurValidite, 'B2'))
                    NbDefautsB2=NbDefautsB2+1;
                elseif (strcmp(VecteurValidite, 'B3'))
                    NbDefautsB3=NbDefautsB3+1;
                elseif (strcmp(VecteurValidite, 'C1'))
                    NbDefautsC1=NbDefautsC1+1;
                elseif (strcmp(VecteurValidite, 'C2'))
                    NbDefautsC2=NbDefautsC2+1;
                elseif (strcmp(VecteurValidite, '>C2'))
                    NbDefautsC2sup=NbDefautsC2sup+1;
                end
    Merci

  7. #7
    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
    Le problème vient donc du fait que VecteurValidite est un tableau de char, cela signifie qu'il y a des espaces.

    Par exemple la ligne'B1' n'est pas 'B1' mais 'B1 '.
    Si tu compares 'B1' et 'B1 ' MATLAB te retourne FAUX avec STRCMP.

    Le mieux serait de transformer VecteurValidite en tableau de cellules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    C=cellstr(VecteurValidite);
    C=cellstr(VecteurValidite);
    compare = {'B2','B3','C1','C2','>C2'};
    NbDefauts = zeros(1,length(compare));
    for i=1:length(C)
        ind = strcmp(C{i},compare); %plus rapide que STRMATCH
        NbDefauts(ind) = NbDefauts(ind)+1;
    end
    Le mieux serait encore que tu modifies le code où tu as construit VecteurValidite pour que ce soit un tableau de cellules.

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    J'ai pu récupérer un vecteur VecteurClasse correspondant au vecteurvalidite, qui contient uniquement des chiffre à la place des caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     whos VecteurClasse
     
      Name               Size            Bytes  Class     Attributes
     
      VecteurClasse      4x1                32  double    global
    Après j'ai essayé deux codes différents:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            for i=1:TailleVecteurClasse
                if (strcmp(VecteurClasse(i,:),1))
                    NbDefautsB2=(NbDefautsB2+1);
                elseif (strcmp(VecteurClasse(i,:),2))
                    NbDefautsB3=(NbDefautsB3+1);
                elseif (strcmp(VecteurClasse(i,:),3))
                    NbDefautsC1=(NbDefautsC1+1);
                elseif (strcmp(VecteurClasse(i,:),4))
                    NbDefautsC2=(NbDefautsC2+1);
                elseif (strcmp(VecteurClasse(i,:),5))
                    NbDefautsC2sup=(NbDefautsC2sup+1);
                end 
            end
    et un autre sans le strcmp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            for i=1:TailleVecteurClasse
                if (VecteurClasse(i,:)==1 )
                    NbDefautsB2=(NbDefautsB2+1);
                elseif (VecteurClasse(i,:)==2)
                    NbDefautsB3=(NbDefautsB3+1);
                elseif (VecteurClasse(i,:)==3)
                    NbDefautsC1=(NbDefautsC1+1);
                elseif (VecteurClasse(i,:)==4)
                    NbDefautsC2=(NbDefautsC2+1);
                elseif (VecteurClasse(i,:)==5)
                    NbDefautsC2sup=(NbDefautsC2sup+1);
                end 
            end
    Avec


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    VecteurClasse =
     
         3
         3
         3
         1
     
     
    NbDefautsC1 =
     
         []
    Sans succès

  9. #9
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Caro-Line Voir le message
    Le problème vient donc du fait que VecteurValidite est un tableau de char, cela signifie qu'il y a des espaces.

    Par exemple la ligne'B1' n'est pas 'B1' mais 'B1 '.
    Si tu compares 'B1' et 'B1 ' MATLAB te retourne FAUX avec STRCMP.

    Le mieux serait de transformer VecteurValidite en tableau de cellules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    C=cellstr(VecteurValidite);
    C=cellstr(VecteurValidite);
    compare = {'B2','B3','C1','C2','>C2'};
    NbDefauts = zeros(1,length(compare));
    for i=1:length(C)
        ind = strcmp(C{i},compare); %plus rapide que STRMATCH
        NbDefauts(ind) = NbDefauts(ind)+1;
    end


    Le mieux serait encore que tu modifies le code où tu as construit VecteurValidite pour que ce soit un tableau de cellules.
    J'ai essayé avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            C=cellstr(VecteurClasseQualite);
            C=cellstr(VecteurClasseQualite);
            compare = {'B2','B3','C1','C2','>C2'};
            NbDefauts = zeros(1,length(compare));
            for i=1:length(C)
                ind = strcmp(C{i},compare); 
                NbDefauts(ind) = NbDefauts(ind)+1
            end
            NbDefauts(1)
            NbDefauts(3)
    Voici ce que ça retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    NbDefauts =
     
         0     0     0     0     0
     
    NbDefauts =
     
         0     0     0     0     0
     
    NbDefauts =
     
         0     0     0     0     0
     
    NbDefauts =
     
         0     0     0     0     0
     
    ans =
     
         0
     
    ans =
     
         0
    Il semblerai aucune détection ou incrémentation ne se fait..

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Désolé mais ceci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    VecteurClasse =[3 3 3 1]'
    TailleVecteurClasse = length(VecteurClasse);
    NbDefautsC1   = 0
    NbDefautsB2   = 0
     
    for i=1:TailleVecteurClasse
        if (VecteurClasse(i,:)==1 )
            NbDefautsB2=(NbDefautsB2+1)
        elseif (VecteurClasse(i,:)==2)
            NbDefautsB3=(NbDefautsB3+1);
        elseif (VecteurClasse(i,:)==3)
            NbDefautsC1=(NbDefautsC1+1)
        elseif (VecteurClasse(i,:)==4)
            NbDefautsC2=(NbDefautsC2+1);
        elseif (VecteurClasse(i,:)==5)
            NbDefautsC2sup=(NbDefautsC2sup+1);
        end 
    end
    As tu regarder la valeur de "TailleVecteurClasse" ?

    Christophe

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    VecteurValidite={'B2';'B3';'C2';'B2';'B2';'>C2';'C1';'B3';'>C2';'>C2'}
     
    VecteurValidite = 
     
        'B2'
        'B3'
        'C2'
        'B2'
        'B2'
        '>C2'
        'C1'
        'B3'
        '>C2'
        '>C2'
     
    >> C=cellstr(VecteurValidite);
            C=cellstr(VecteurValidite);
            compare = {'B2','B3','C1','C2','>C2'};
            NbDefauts = zeros(1,length(compare));
            for i=1:length(C)
                ind = strcmp(C{i},compare); 
                NbDefauts(ind) = NbDefauts(ind)+1
            end
            NbDefauts(1)
            NbDefauts(3)
     
    NbDefauts =
     
         1     0     0     0     0
     
     
    NbDefauts =
     
         1     1     0     0     0
     
     
    NbDefauts =
     
         1     1     0     1     0
     
     
    NbDefauts =
     
         2     1     0     1     0
     
     
    NbDefauts =
     
         3     1     0     1     0
     
     
    NbDefauts =
     
         3     1     0     1     1
     
     
    NbDefauts =
     
         3     1     1     1     1
     
     
    NbDefauts =
     
         3     2     1     1     1
     
     
    NbDefauts =
     
         3     2     1     1     2
     
     
    NbDefauts =
     
         3     2     1     1     3
     
     
    ans =
     
         3
     
     
    ans =
     
         1

  12. #12
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    Oui voila comment je récupère la taille de vecteurclasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TailleVecteurClasse=size(VecteurClasse);
    TailleVecteurClasse=TailleVecteurClasse(1,1)
    J'ai bien un evaleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TailleVecteurClasse =
     
         4

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Points : 726
    Points
    726
    Par défaut
    Si tu sais que "VecteurClasse" est un vecteur, utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TailleVecteurClasse = length(VecteurClasse)
    Car si tu te trompes dans l'indice de la fonction "size", tu risques de faire une boucle allant de 1 à 1 ce qui ne va pas très loin...

    Fais un copier/coller des codes que je t'ai mis au-dessus et regardes si tu obtiens la même chose.

    Puis essaies à nouveau dans ton code pour nous dire où çà bloque...

    Christophe

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 40
    Points
    40
    Par défaut
    ça marche !! il fallait juste initier les variables NbDefauts à 0

    Merci à vous

    Bonne journée

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

Discussions similaires

  1. [Débutant] Deux incréments dans une boucle for simultanément
    Par lFantasyz dans le forum MATLAB
    Réponses: 2
    Dernier message: 11/04/2014, 16h19
  2. Nom de fichier image incrémenté dans une boucle for
    Par franck31 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/10/2011, 16h49
  3. [TPW] Incrémentation du compteur dans une boucle for
    Par sukhoimk dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 15/07/2011, 17h58
  4. Addition dans une boucle For de variables incrémentées
    Par heberco dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/01/2011, 18h48
  5. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05

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