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 :

Action sur l'indice d'une boucle "FOR"


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut Action sur l'indice d'une boucle "FOR"
    Bonjour,
    Je m'étonne de ne pas pouvoir, dans une boucle "for", agir sur l'indice 'i'?
    En effet dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i = 1:10
        i
        if i==5
            i = i +1;
        end
    end
    Matlab retourne 1;2;3;4;5;6;7;8;9;10.
    Le saut du 6 n'a pas eu lieu (alors qu'en C, même si ce n'est pas propre, c'est tout à fait possible...).
    Alors je suppose que c'est normal et que c'est dû au langage Matlab.
    Mais quel explication peut-ton donner à ca?
    Quelqu'un aurait-il une solution tout aussi simple pour faire des sauts dans une boucle?

    Merci d'avance,

  2. #2
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    Si le saut du 5 a bien lieu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for i = 1:10
        i
        if i==5
            disp('avant')
            i
            i = i +1;
            disp('apres')
            i
        end
    end
    te retourne comme prévu:

    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
     
    i =
         1
    i =
         2
    i =
         3
    i =
         4
    i =
         5
    avant
    i =
         5
    apres
    i =
         6
    i =
         6
    i =
         7
    i =
         8
    i =
         9
    i =
        10

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Mon but est justement qu'il saute une itération.
    Autrement dit qu'il n'affiche pas (et donc, dans mon application, "n'éxécute pas") le code situé dans l'itération suivante c'est à dire la 6°.
    et devrait afficher:
    1
    2
    3
    4
    5
    7
    8
    9
    10

    et donc 9 exécutions plutot que 10.

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Euh tu peux faire ça évidemment, mais seulement si les indices sont fixes. Sinon tu dois tester en début de boucle et ne pas exécuter l'intérieur quand il ne faut pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i = [1:5 7:10],
      i
    end

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Le problème est que ce "saut" dépends du résutat d'une itération précédente et n'est donc pas fixe en position et en nombre...
    Le seul moyene que je vois c'est de faire un "flag" que je mets à 1 et puis que je test dans l'itération suivante.
    Malheureusement ca va alourdir mon code de quelques "IF" supplémentaires alors qu'il en est déja bien rempli...

  6. #6
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    salut,

    essaie avec l'instruction 'continue', qui te permet de casser l'iteration courante pour reprendre a la suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i=1:10
      if i==5
        continue;
      end
      i
    end
    A+

  7. #7
    Membre actif Avatar de LordPeterPan2
    Inscrit en
    Février 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 247
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par Phelix2003 Voir le message
    Le problème est que ce "saut" dépends du résutat d'une itération précédente et n'est donc pas fixe en position et en nombre...
    Le seul moyene que je vois c'est de faire un "flag" que je mets à 1 et puis que je test dans l'itération suivante.
    Malheureusement ca va alourdir mon code de quelques "IF" supplémentaires alors qu'il en est déja bien rempli...
    Je te suuggère de faire alors un boucle while, car si tu change l'index de la boucle for c'est pas très "clean" de toute façon

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Je ne trouve pas d'instruction "next"...

  9. #9
    Membre actif Avatar de LordPeterPan2
    Inscrit en
    Février 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 247
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par Phelix2003 Voir le message
    Je ne trouve pas d'instruction "next"...
    Oui je me suis trompé (j'ai effacé mon post) , sous matlab, elle s'apelle "continue"

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Kangourou Voir le message
    salut,

    essaie avec l'instruction 'continue', qui te permet de casser l'iteration courante pour reprendre a la suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i=1:10
      if i==5
        continue;
      end
      i
    end
    A+
    L'instruction "continue" ne me permet pas de sauter l'étape suivante... Uniquement d'éviter le code qui le suit pour cette itération.

  11. #11
    Membre actif Avatar de LordPeterPan2
    Inscrit en
    Février 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 247
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par Phelix2003 Voir le message
    L'instruction "continue" ne me permet pas de sauter l'étape suivante... Uniquement d'éviter le code qui le suit pour cette itération.
    Donc au lieu de faire le test sur 5 fais le sur 6 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i=1:10
      if i==6
        continue;
      end
      i
    end

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par LordPeterPan2 Voir le message
    Donc au lieu de faire le test sur 5 fais le sur 6 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i=1:10
      if i==6
        continue;
      end
      i
    end
    Merci, ça je savais le faire .
    Evidemment c'est uniquement dans l'état X (5) que je détermine ou non si je dois effctuer l'état suivant X+1 (6)...

  13. #13
    Membre actif Avatar de LordPeterPan2
    Inscrit en
    Février 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 247
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par Phelix2003 Voir le message
    Merci, ça je savais le faire .
    Evidemment c'est uniquement dans l'état X (5) que je détermine ou non si je dois effctuer l'état suivant X+1 (6)...
    Dans ces cas là, utilise une boucle while.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par LordPeterPan2 Voir le message
    Dans ces cas là, utilise une boucle while.
    Oui effectivement je viens de trouver la soluce en mm tps


    Merci,

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

Discussions similaires

  1. Action sur le serveur via une page web
    Par raphxyz dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 26/08/2006, 18h07
  2. Réponses: 14
    Dernier message: 25/06/2006, 19h18

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