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 :

Le tableaux à itérer dans une boucle for n'est pas instancié


Sujet :

MATLAB

  1. #1
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut Le tableaux à itérer dans une boucle for n'est pas instancié
    Bonjour,

    en fait, ce n'est pas une question, mais une découverte que je veux partager ici avec vous.

    Dans la première boucle for, on demande à Matlab de parcourir avec la vairaible i toutes les valeurs du vecteur ligne M. Dans ce cas, on est bien d'accord que M est instancié (il occupre une vraie place dans la vraie mémoire).

    La question est la suivante : dans la deuxième boucle, qui revient exactement au même, est-ce que le vecteur 1:10 est instancié ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    M = 1:10 ;
    for i=M
        if i<10   
            disp(i) ;
        end
    end
     
    for i=1:10
        if i<10   
            disp(i) ;
        end
    end
    La réponse est non. La preuve par ce peitit code :
    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
    function test_infinite_loop
    s = warning('off', 'MATLAB:warn_truncate_for_loop_index') ; % disable warning for infinite for loops
    for i = 1:inf % sans la ligne ci-dessus, on auraut à la console : warning FOR loop index is too large. Truncating to 281474976710655.
        if i>10
            break
        end
    end
    warning(s) ; % reset warnings to previous state
    
    j = 1:281474976710655 ; % Error using ==> colon Maximum variable size allowed by the program is exceeded.
    for i=j 
        if i>10
            break
        end
    end
    Savoir ça est-il utile ?
    Oui
    car je peux faire des boucles for infinies à la place des boucles while infinie. L'intérêt est que je récupère "gratuitement" un compteur du nompbre de tours effectué.


    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    k=0 ;
    while true
    k=k+1 ;
    ... code qui utilise k ;
    end
    Je trouve plus joli d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    warning('off', 'MATLAB:warn_truncate_for_loop_index') ; 
    for k=1:inf
    ... code qui utilise k ;
    end
    Plus d'info ici : http://blogs.mathworks.com/loren/200...ges-and-state/
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    C'est effectivement plus une question de goût et de style de programmation.

    Je préfère pour ma part utiliser une boucle FOR-END lorsque je connais à l'avance la nombre maximale d'itérations à effectuer.

    Dans ton dernier exemple, il ne faut pas oublier de ré-activer l'avertissement après la boucle FOR-END (comme tu l'as fait dans ton autre code au milieu de ton message)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/07/2013, 10h06
  2. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45
  3. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

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