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 optimiser plusieurs boucles FOR-END imbriquées


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut Comment optimiser plusieurs boucles FOR-END imbriquées
    Bonsoir a tous,
    J'aurais besoin d'un tout petit peu d'aide svp.
    J'ai 2 boucles For que j'aimerai simplifier, car elle diminuent grandement le temps d'exection de mon soft.

    Les voici:
    La première:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            for x=1:100
                for y=1:100
                    RotatedTest(y,x)=0;
                end
            end
    Ceci ne correspondant qu'a une seule partie de l'image, je chercher a mettre a 0 les 100*100 premiers pixels de mon image, je ne sais pas comment utiliser la fonction.

    La seconde je pense qu'on doit pouvoir untiliser la fonction find non? Mais comment assigner la contition?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
           [Y,X]=size(MergedArray);
           %find color grayscale greater than 245 
             for y=1:Y
                 for x=1:X
                     if(MergedArray(y,x)>245)
                        MergedArray(y,x)=0;
                     end
                 end
             end
    Merci beaucoup
    Thomas

  2. #2
    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 828
    Points
    14 828
    Par défaut
    Première boucle, si RotatedTest n'a pas été défini avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RotatedTest = zeros(100,100);
    Sympathique, non ?

    La 2ème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MergedArray(MergedArray>245) = 0
    Je n'ai pas Matlab sous la main pour vérifier, j'ai quand même une crainte c'est que cette méthode risque de te redimensionner ta matrice en vecteur...
    Après il faut utiliser reshape si c'est le cas.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par caro95470
    Première boucle, si RotatedTest n'a pas été défini avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RotatedTest = zeros(100,100);
    Sympathique, non ?
    Merci beaucoup pour la réponse, mais en fait, ca ca me redimentionne toute mon image comme étant une image de 100*100 avec tous les caracteres a 0.
    ALors que ce que j'essaye de faire c'est ne mettre a 0 qu'une partie de mon image.
    En effet, ceci correspond uniquement au coint supérieur gauche de mon image qui elle est 10fois plus grande. Et je ne veux pas toucher au reste de l'image.

    Merci pour votre aide;
    Thomas

  4. #4
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    Par indexage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RotatedTest(1:100,1:100)=0;

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    La manière suivante fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = 1:10;
    y = 1:10;
    RotatedTest(y,x)=0;
    Merci Rostomus, je viens juste de voir ta réponse, je vais tester.

    Bye
    Thomas

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Désolé, j'ai vraiment du mal avec le passage par indexation pour supprimer les boucles for.
    J'ai encore un cas dans lequel j'ai 1 image, que je veux redimensionner uniquement sur la zone contenant des données positives dedans.
    Avec 2 boucles For, ca donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        [yMax,xMax]=size(MergedArray);
        for y=1:yMax
            for x=1:xMax
                if(MergedArray(y,x)>0)
                    NewMergeArray(y,x)=MergedArray(y,x);
                end
            end
        end
        MergedArray=NewMergeArray;
    Mais une fois de plus l'image étant très grosse, ca prend énormément de temps.
    Est ce que quelqu'un pourrait m'aider a résoudre la condition if a l'intérieur des 2 boucles, et par la même occasion est-il possible de supprimer aussi les boucles?

    Merci beaucoup
    Thomas

  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 308
    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 308
    Points : 52 892
    Points
    52 892
    Par défaut
    Je ne suis pas sur d'avoir tout suivi mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    M=rand(5)
    M(1:2,1:2)=M(1:2,1:2).*(M(1:2,1:2)>.5)
    Est-ce que c'est ce que tu cherches à faire ? Ce qui se traduirait dans ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewMergeArray(1:yMax,1:xMax)=MergeArray(1:yMax,1:xMax).*(MergeArray(1:yMax,1:xMax)>0)

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    En fait, j'ai un peu de mal a comprendre ce que tu fais avec cette opération.
    J'ai essayé de mettre ton code tel kel, mais je n'obtiens pas le bon résultat.
    En fait j'essaye de redimensionner mon image en ne copiant dans une nouvelle image, quel la partie ou les valeur a l'intérieur de mon image sont non nulle, (on enlève les parties noires sur les bords de mon image).
    Ton code ne redimensionne pas mon image, il contiens toujours les bandes noires sur les bords.

    Merci pour ton aide

  9. #9
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    c'est un peu ambigu je pense, un exemple d'une matrice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    x=
     
    1 2 3 4 0 3
    3 1 3 0 0 0
    3 2 1 3 0 2
    0 0 2 3 4 5
    comment tu veux faire?

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Voici l'image que j'essaye de modifier:



    LA partie en Rouge est normalement costituée de 0, et c'est la partie que j'essaye d'enlever.
    Avec les boucles for, nous obtenons l'image sans la partie Rouge, ce qui est ce que je veux.
    Pour cela, je test simplement quand la valeur des pixels de mon image est positive, je recopie ces pixels ds ma nouvelle image. La partie noire a gauche n'est pas importante.
    Mais avec les boucles, cela demande beaucoup plus de temps au systeme.
    J'aurais aimé faire la meme chose, mais en passant par l'indéxation et la vectorisation, car cette methode est beaucoup plus rapide.
    Je pense avoir compris la methode de DutMatlab, et ca me parait juste, mais le résultat obtenu est le meme que l'image avec les bandes rouge.

    Merci pour votre aide
    Thomas

  11. #11
    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 828
    Points
    14 828
    Par défaut
    Le mot-clé c'est que tu veux "enlever" des éléments à ta matrice.
    Si je comprends bien tu souhaites supprimer les lignes et colonnes de zeros.
    si c'est bien ça une méthode (il y en a sûrement d'autres...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    %Ecriture d'une matrice avec des lignes et colonnes complètes de 0
    A=rand(5,6);
    A=[A;repmat(zeros(1,size(A,2)),3,1)];%ajoute 3 lignes de zeros
    A=[A,repmat(zeros(size(A,1),1),1,5)]%ajoute 5 colonnes de zeros
    cols=find(all(A==0)) %trouve les colonnes remplies que de 0
    B=A;
    B(:,cols)=[] %enleve les colonnes remplies que de 0
    rows = find(all(B'==0)) %trouve les lignes remplies que de 0
    B(rows,:)=[] %enleve les lignes remplies que de 0

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 308
    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 308
    Points : 52 892
    Points
    52 892
    Par défaut
    D'autres méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A=rand(5,6);n=2;m=3;
    A=[A zeros(size(A,1),n) ; zeros(m,size(A,2)+n)]
    B=A;
    B(:,~any(A,1))=[];
    B(~any(A,2),:)=[]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A=rand(5,6);n=2;m=3;
    A=[A zeros(size(A,1),n) ; zeros(m,size(A,2)+n)]
    [I,J]=find(A);
    B(1:I,1:J)=A(1:I,1:J)
    Et la plus tricky comme on dit sur le CSSM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A=rand(5,6);n=2;m=3;
    A=[A zeros(size(A,1),n) ; zeros(m,size(A,2)+n)]
    B=deblank(A.');
    B=deblank(B.')

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Merci beaucoup,

    Je v essayer d'implémenter ca, mais j'ai pas mal de difficultés a comprendre les vectorisations.
    Par exemple d'apres vos exemple, pour vectoriser une condition If, il faut passer par la fonction find.
    Et pour éliminer les boucles for, il suffit de définir entre parenthèses les rages pour les matrices?
    C'est bien ca?

    J'ai essayé de trouver des docments sur internet qui explique ceci plus précisément, mais c'est assez difficile. Je pense que le seul moyen de bien comprendre c'est de pratiquer.

    Si vous savez ou je peux trouver de la doc a ce sujet, je vous en serait très reconnaissant.

    Merci beaucoup

    J'essaye d'implémenter ca et si j'y arrive pas je vous dis ;-)

    Thanks
    Thomas

  14. #14
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 308
    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 308
    Points : 52 892
    Points
    52 892

  15. #15
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Merci bien, je vais regarder ca.

    THomas

  16. #16
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Dutmatlab
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A=rand(5,6);n=2;m=3;
    A=[A zeros(size(A,1),n) ; zeros(m,size(A,2)+n)]
    Bonsoir,

    J'ai un peu du mal a comprendre ta méthode cidessus.
    Je voudrais m'en servir pour redimensionner une matrice et l'agrandir en ajoutant des zeros a la fin.
    Je voulais appliquer ton cas a ma matrice, mais je trouve des résultats, bizarres.
    Pourrais-tu m'expliquer ce que fait exactement ton opératioN?

    Merci beaucoup
    Thomas

  17. #17
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 308
    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 308
    Points : 52 892
    Points
    52 892
    Par défaut
    Dans le code, n est le nombre de colonnes de 0 et m est le nombre de lignes de 0 ajoutées ajoutées à la fin de la matrice.

    Il est possible de décomposer la méthode comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A=rand(5,6);
    n=2;
    m=3;
    s=size(A);
    A = [A zeros(s(1),n)]
    A = [A ; zeros(m,s(2)+n)]

  18. #18
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    OK merci, c'est beaucoup plus clair.
    Je vois que Matlab permet de beaucoup réduire le nombre de commandes. C'est vraiment bien.

    Merci
    Thomas

  19. #19
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Rebonsoir a tous.

    J'ai encore et toujours des questions lol.
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [y,x]=find(MyRotatedTest(1:OrdinateSecondImage,1:AbscissaSecondImage)==256)
    MyRotatedTest(y,x)=0;
    MyRotRefX=x;
    MyRotRefY=y;
    Simple, je veux chercher le pixel qui a une intensité de 256 (il n'y en a qu'un "NORMALEMENT").
    Je relève ses coordonnées que j'utilise après.

    Mon problème c'est si il n'y a pas de point d'intensité 256. Comment faire pour assigner a y et x, la valeur 0, au lieu de vide, ce qui fait planter mon programme.

    Merci beaucoup.
    Thomas

  20. #20
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Bonsoir,

    J'aurais eu besoin de faire cette opération en utilisant les vecteurs:

    CircleEquation=sqrt(((x-XRotationCenter)^2)+((y-YRotationCenter)^2));

    ca ne fonctionne pas avec les vecteurs, mais si j'utilise 2 boucles for, ca fonctionne très bien?
    y et x sont de taille différente.
    quelqu'un peut-it m'aider?

    Merci beaucoup
    Thomas

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Plusieurs boucles For next imbriquées
    Par athos7776 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/04/2011, 22h48
  2. Utilisation plusieurs boucles For imbriquées
    Par stick25 dans le forum Général VBA
    Réponses: 2
    Dernier message: 07/04/2010, 18h00
  3. Sortir de deux boucles FOR-END imbriquées
    Par Nabuchodonosor15 dans le forum MATLAB
    Réponses: 5
    Dernier message: 31/08/2009, 09h58
  4. Réponses: 1
    Dernier message: 22/11/2007, 22h52
  5. Réponses: 3
    Dernier message: 24/05/2007, 17h56

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