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 :

soucis avec la vectorisation d'une boucle imbriquée [Débutant]


Sujet :

MATLAB

  1. #1
    Membre régulier Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut soucis avec la vectorisation d'une boucle imbriquée
    Voilà y a un moment on m'a conseillé de vectoriser mes programmes afin de les optimiser, donc je m'y suis lancé et je m'en sors pas vraiment
    voici une partie de mon programme que je veux vectoriser avec une petite tentative, je vous demande de me corriger s'il vous plaît:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Ma = 0;
    X = X(:); % où X est une matrice
    b= length (X);
    for i=1:b
        for j=1:b
           v= abs (X(i)-X(j));
           noyeau = (1/(pi*0.08)) * exp ((v*v)/(-0.08));  
           Ma=Ma+noyeau;
        end
    end
    j'ai donc essayé de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    X = X(:);
    b= length (X);
    for i=1:b
        for j=1:b
            Ma = sum (1/(pi*0.08)) * exp ((abs (X(i)-X(j))*abs (X(i)-X(j)))/(-0.08));      
        end
    end
    Mais ça donne pas le même résultat, je dois me tromper quelque part..
    Et merci d'avance.

  2. #2
    Membre habitué
    Inscrit en
    Août 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 129
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par Imène_23 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    X = X(:);
    b= length (X);
    for i=1:b
        for j=1:b
            Ma = sum (1/(pi*0.08)) * exp ((abs (X(i)-X(j))*abs (X(i)-X(j)))/(-0.08));      
        end
    end
    je vois deja que dans le premier code tu incremente Ma à chaque iteration alors que dans le deuxieme, tu le remet à jour à chaque fois. tu voulais probablement dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    X = X(:);
    b= length (X);
    for i=1:b
        for j=1:b
            Ma = Ma + sum (1/(pi*0.08)) * exp ((abs (X(i)-X(j))*abs (X(i)-X(j)))/(-0.08));      
        end
    end
    chez moi c'est suffisant pour résoudre le problème. n'hésite pas si tu as encore un soucis..

  3. #3
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Ce que tu as fais ce n'est pas vraiment de la vectorisation: tu as autant de boucles après qu'avant. Celà dit c'est un premier pas avant de vectoriser.

    Pourquoi avoir tout changer sur ta ligne, il faut juste remplacer v par sa valeur et rajouter un "Ma +" devant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for i=1:b
        for j=1:b
           Ma=Ma+(1/(pi*0.08)) * exp ((abs (X(i)-X(j))*abs (X(i)-X(j)))/(-0.08));       
        end
    end
    Mais tu as raison, il faut vectoriser pour supprimer les boucles, pour celà tu peux utiliser la fonction MESHGRID:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [X1,X2] = meshgrid(X,X);
    Ma=sum((1/(pi*0.08)) * exp ((abs (X-X).*abs (X-X))/(-0.08)));
    Attention à ne pas oublier le "." dans ce cas pour multiplier les matrices entre elles.

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  4. #4
    Membre régulier Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut
    Merci duf42 pour ta réponse

    j'ai essayé ce que tu m'a proposer avec une matrice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     X = [ 1	   2	1
            5	   5	5
            1	   1	2]
    j'ai : 35.809862195676460 comme résultat avec ta vectorisation,

    alors qu'avec mon programme de départ j'ai 1.153875709877335e+02.

  5. #5
    Membre régulier Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par sellamelie Voir le message

    chez moi c'est suffisant pour résoudre le problème. n'hésite pas si tu as encore un soucis..
    Merci t'es super gentille , et ta proposition marche bien.

    mais ça serait intéressant d'enlever les deux boucles comme me la proposer duf42, mais je n'obtiens pas le même résultat.

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    Il y a une erreur dans le code de Duf42. Il définit X1 X2 via meshgrid, mais ni X1 ni X2 n'interviennent dans la suite du code. Du coup il faut surement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [X1,X2] = meshgrid(X,X);
    Ma=sum((1/(pi*0.08)) * exp ((abs (X1-X2).*abs (X1-X2))/(-0.08)));

  7. #7
    Membre régulier Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Bonjour,

    Il y a une erreur dans le code de Duf42. Il définit X1 X2 via meshgrid, mais ni X1 ni X2 n'interviennent dans la suite du code. Du coup il faut surement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [X1,X2] = meshgrid(X,X);
    Ma=sum((1/(pi*0.08)) * exp ((abs (X1-X2).*abs (X1-X2))/(-0.08)));
    Bonjour VV33D,
    Merci pour ta contribution, mais ça marche toujours pas voici le résultat que j'ai obtenu (un vecteur avec 9 valeurs):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [15,9155239649532 ;11,9366207318922;15,9155239649532;7,95780646612212	;11,9366207318922;15,9155239649532;15,9155239649532	;11,9366207318922;7,95780646612212]

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il manque juste un SUM supplémentaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ma=sum(sum((1/(pi*0.08)) * exp ((abs (X1-X2).*abs (X1-X2))/(-0.08))));
    Ou avec un seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ma=sum((1/(pi*0.08)) * exp ((abs (X1(:)-X2(:)).*abs (X1(:)-X2(:)))/(-0.08)));
    Dernière modification par Invité ; 25/07/2011 à 23h34.

  9. #9
    Membre régulier Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut
    Bonsoir Winjerome

    1000 Merci , comme dab t'a toujours la bonne solution.

    Je me permets de te demander encore comment faire dans le cas où j'utilise la matrice tel qu'elle est sans la déplier dans un vecteur avec X( : ); j'aurais donc deux boucles imbriquées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Ma = 0;
    [nbrows,nbcols] = size(X); % nbr de ligne et de colone de l'image
    for p=1:nbrows
      for q=1:nbcols
       for a=1:nbrows
        for b=1:nbcols
          v = abs (X(a,b)-X(p,q));
          noyeau = (1/(2*pi*sigma*sigma)) * exp ((v*v)/(-2*sigma*sigma));
          Ma=Ma+noyeau;
         end
       end  
      end
    end
    est-ce que je ne factorise qu'une des boucles ou est-ce qu'il y a un moyen de faire le tout en même temps ?

    et merci infiniment pour ton aide encore une fois

  10. #10
    Invité
    Invité(e)
    Par défaut
    En mettant [X1,X2] = meshgrid(X(:),X(:)); ça devrait faire l'affaire

  11. #11
    Membre régulier Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut
    Merci Winjerome ;
    Voilà j'ai encore un souci (j'allais ouvrir une autre discussion mais je continue ici c'est mieux en espérant que vous allez m'aider) donc j'ai essayé le programme sur une image couleur (121*181)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function Ma = deno (X); 
    Ma = 0;
    X = X(:);
    [X1,X2] = meshgrid(X,X);
    Ma=sum((1/(pi*0.08)) * exp ((abs (X1(:)-X2(:)).*abs (X1(:)-X2(:)))/(-0.08)));
    end
    j'ai eu cette erreur-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Maximum variable size allowed by the program is exceeded.
     
    Error in ==> meshgrid at 44
        xx = xx(ones(ny, 1),:);
     
    Error in ==> deno at 4
    [X1,X2] = meshgrid(X,X);
    comment remédié à cela?
    Merciiii

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

Discussions similaires

  1. [PHP 5.3] Soucis avec le résultat d'une requête (double boucles while)
    Par beegees dans le forum Langage
    Réponses: 7
    Dernier message: 31/05/2010, 22h26
  2. afficher les données d'une Boucle imbriquée
    Par doria_serine dans le forum BIRT
    Réponses: 8
    Dernier message: 20/08/2009, 19h11
  3. Accélérer une boucle imbriquée
    Par Ulath0 dans le forum R
    Réponses: 1
    Dernier message: 06/08/2009, 10h30
  4. [labview 8.6]Probleme avec un tableau et une boucle FOR
    Par alexandredu34 dans le forum LabVIEW
    Réponses: 1
    Dernier message: 14/06/2009, 18h32
  5. Petit soucis avec Thread::Queue et une classe
    Par vodevil dans le forum Web
    Réponses: 16
    Dernier message: 09/06/2006, 21h41

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