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 :

comment se passer des boucles for


Sujet :

MATLAB

  1. #1
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut comment se passer des boucles for
    Bonjour,

    J'ai un grand handicap avec matlab !!! je ne sais pas comment éviter les boucles for qui sont très gourmandes en temps de calcul

    J'essaie désespérément de remplacer cette boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    P=[x y z];
    for i=1:length(w)
        S=find(L==w(i));
        xp(j)= P(S(1),1,:);
        yp(j)= P(S(1),2,:);
        zp(j)= P(S(1),3,:);
        j=j+1;
     
    end
    mais je n'y arrive pas

    Pouvez-vous m'orienter sans me donner la solution pour que je puisse enfin me passer une bonne fois pour toute des boucles for

  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 882
    Points
    52 882
    Par défaut
    Il ne faut pas tout de suite vouloir supprimer la boucle.

    En premier lieu, il faut chercher à l'optimiser.

    Voici deux pistes :

    1. Utiliser la pré-allocation de mémoire
    2. Bien lire la documentation de la fonction FIND qui peut prendre plus d'un argument d'entrée
    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)

  3. #3
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Merci pour ta réponse,

    Utiliser la pré-allocation de mémoire
    Je ne connais pas exactement la taille de mes matrices à l'avance !!!

  4. #4
    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 882
    Points
    52 882
    Par défaut
    Citation Envoyé par Décembre Voir le message
    Je ne connais pas exactement la taille de mes matrices à l'avance !!!
    Dans le code que tu nous montres, leurs tailles sont connues... d'ailleurs la variable j ne sert à rien

    Sinon, il arrive parfois que l'on ne puisse pas connaitre la taille des variables à l'avance. Mais on peut estimer une taille maximale. Et donc faire la pré-allocation sur cette taille maximale. Les variables finales contiendront donc quelques données inutiles mais faciles à gérer.
    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)

  5. #5
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par Décembre Voir le message
    Pouvez-vous m'orienter sans me donner la solution pour que je puisse enfin me passer une bonne fois pour toute des boucles for
    Et si tu nous disais que représente les variables w, L x y z ? et que veux tu faire avec cette boucle ?

    une copie de "whos" par exemple !
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  6. #6
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Voici la copie de whos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Name          Size                    Bytes  Class
    x         71385x1                    571080  double array
    y         71385x1                    571080  double array
    z         71385x1                    571080  double array
    w            65x1                       520  double array
    L             1x71385                571080  double array
    Dans le code que tu nous montres, leurs tailles sont connues... d'ailleurs la variable j ne sert à rien
    Si j'enlève le j je risque d'écraser les valeurs de xp, yp et zp.

    Merci beaucoup pour votre aide

  7. #7
    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 882
    Points
    52 882
    Par défaut
    Citation Envoyé par Décembre Voir le message
    Si j'enlève le j je risque d'écraser les valeurs de xp, yp et zp.
    Oui mais tu peux bien remplacer j par i, non ?
    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)

  8. #8
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Oui mais tu peux bien remplacer j par i, non ?
    Ouiiiiiiii tu as raison

  9. #9
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    J'aurais aimée me passer de la précédente boucle for mais apparemment c'est impossible

    Dans le but d'optimiser mon code, je vais tenter de remplacer la boucle suivante:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for i=1:3:length(L)
        a=[L(i) L(i+1) L(i+2)];
        a=sort(a);
        M(j,:)=[a(1) a(2)];
        j=j+1;
        M(j,:)=[a(1) a(3)];
        j=j+1;
        M(j,:)=[a(2) a(3)];
        j=j+1;
    end
    Pouvez-vous m'orienter une autre fois

  10. #10
    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 882
    Points
    52 882
    Par défaut
    Tu traites les valeurs de L par paquets de 3... dans ce cas, redimensionne L en une matrice 3xN (ou Nx3) appliques SORT sur la matrice en dehors de la boucle
    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)

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Humhum
    Deux choses :

    * Note bien ce que t'as dit Dut : la fonction FIND peut etre utilisee avec plus qu'un seul argument ;-)

    * Pourquoi ecrire P(S(1), 1, : ) alors qu'a priori P a seulement 2 dimensions ?

    Et enfin, tu connais la fonction ACCUMARRAY ? Elle peut t'etre utile...

  12. #12
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Salut,

    Je n'arrive pas à trouver ce qui cloche tout parait parfait pour moi mais le résultat est différent !!

    voici ce que j'ai fait en suivant tes précieux conseils monsieur Dut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        L1=reshape(L,length(L)/3,3);
        a=sort(L1,2);
        j=1;
        for i=1:length(L)/3
            M(j,:)=[a(i,1) a(i,2)];
            j=j+1;
            M(j,:)=[a(i,1) a(i,3)];
            j=j+1;
            M(j,:)=[a(i,2) a(i,3)];
            j=j+1;
         end
    ce qui me trouble c'est que la matrice M que j'obtiens n'est pas la même

    si vous arrivez à trouver ou ça cloche je vous prie de m'aider

  13. #13
    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 882
    Points
    52 882
    Par défaut
    Remplace
    Citation Envoyé par Décembre Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        L1=reshape(L,length(L)/3,3);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        L1=reshape(L,3,length(L)/3).';
    Tu peux aussi te passer de l'opérateur de transposition en modifiant les indices dans la suite du code.
    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)

  14. #14
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Merci Dut ça marche grâce à toi



    J'ai gagné 4 secondes, mais ce n'est encore pas suffisant alors peux-tu m'expliquer s'il te plait que veux-tu dire par là:

    Tu peux aussi te passer de l'opérateur de transposition en modifiant les indices dans la suite du code.
    merci encore

  15. #15
    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 882
    Points
    52 882
    Par défaut
    C'est assez difficile de parler d'optimisation sans connaitre ni la nature exacte, ni les dimensions du problème ...

    Essaye toujours ceci :

    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
     L1 = reshape(L,3,[]);
    a = sort(L1,1);
    j = 1;
    M = zeros(numel(L),2);
    for i = 1:size(a,2)
        M(j,1) = a(1,i) ;
        M(j,2) = a(2,i);
        j=j+1;
        M(j,1) = a(1,i);
        M(j,2) = a(3,i);
        j=j+1;
        M(j,1) = a(2,i);
        M(j,2) = a(3,i);
        j=j+1;
    end
    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)

  16. #16
    Membre régulier Avatar de Décembre
    Inscrit en
    Avril 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 277
    Points : 110
    Points
    110
    Par défaut
    Je ne sais pas comment te remercier Dut

    Cette boucle s'exécutait en 60 secondes et grâce à toi elle ne dure que 5 secondes

    Merci,merci, merci,merci, merci !!!


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

Discussions similaires

  1. Utilisation des boucles for
    Par _Michel dans le forum Débuter
    Réponses: 6
    Dernier message: 23/09/2008, 11h49
  2. Comment se passer des int ms-dos
    Par Psychique dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 18/10/2007, 14h34
  3. tableaux dynamiques ds des boucles FOR imbriquees
    Par areuh_fr dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 13/12/2006, 11h12
  4. [Debutant] comment faire passer des donnée ???
    Par cyrill.gremaud dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/01/2006, 22h28
  5. Réponses: 5
    Dernier message: 08/03/2004, 10h28

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