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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    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.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 53
    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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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..

+ 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