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 :

éviter le parcours matriciel


Sujet :

MATLAB

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut éviter le parcours matriciel
    Je débute en matlab, j'ai programmé des lignes de code cité ci dessous. Mais j'ai constaté que mon code et gourmand en temps de calcul:
    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
     
     K=[0.25 0.5 1];
     INIT=K(1);
     I0=imresize(ImageReel,INIT,'nearest');
     s=size(I0);
      Speau=0.77;
      Sfond=0.22;
    %M0 et P0 se sont des matrices binaires
    for i=1:s(1)%parcour row
           for j=1:s(2)%parcour col
               if(i==1|j==1|i==s(1)|j==s(2))
                if (P0(i,j)==1)
                     M0(i,j)=1;
                end
               else
                 E=energie(P0,i,j);%fonction qui calcule l'énergie de chaque pixel dans un bloc de taille 3*3 
              if(E>Speau|E<Sfond)
                  M0(i,j)=0;
              else
                  M0(i,j)=1;
              end
         end 
           end
     end
    Pouvez–vous m’aidez à réecrire le code pour évitez le parcourt matricielle dans le but d'optimiser dans le temps ??

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Salut,

    Avant de faire des modifications, tu peux lancer un profil de ton code.

    En gros, tu mets profile on en début de ton programme et une fois fini, tu tapes profview.

    Ca te permettra de cibler les passages qui sont gourmand en temps de calcul

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    oui j'ai essayé avec ça, toute la fonction consomme 0,6s

    Donc mon but c'est ya-il une autre façon pour réecrire le code tout en évitant les deux boucle For(c-a-d le parcour de l'image pixel par pixel) dans le but d'optimiser le temps?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Une solution, si tu possèdes l'Image Processing Toolbox: utliser blkproc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    E = blkproc(P0,[1 1],[1 1],@energie);

    Par contre, la fonction energie devra être codée de façon à traiter chaque bloc 3x3 directement, tu n'auras plus besoin de i et j qui te positionneront dans la matrice.

    Si tu ne possèdes pas l'Image Processing Toolbox,
    une solution serai déjà de faire partir tes boucles à 2 et les faire terminer à s(1) -1 et s(2) -1, ce qui t'éconimiserai un if/else, traitant les bords en dehors des boucles.
    De plus la fonction energie, ne faisant que quelques lignes, tu pourrais l'écrire directement dans la boucle, économisant ainsi l'appel d'une fonction.

    Je ne vois pas d'autres modifications significatives, quelqu'un d'autre pourra peut-être

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    merci Winjerome pour ton aide,
    j'ai essayé avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    E = blkproc(P0,[1 1],[1 1],@energie);
    mais j'ai pas compris comment écrire le code de la fonction energie
    j'ai essayé avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function [E]=energie(P0)
    E=(P0(1,1)^2+P0(1,2)^2+P0(1,3)^2+P0(2,1)^2+P0(2,2)^2+P0(2,3)^2+P0(3,1)^2+P0(3,2)^2+P0(3,3)^2)/9;
    mais je sens que c'est faux.
    En plus de ça avec ce blkproc, comment je peux faire ce test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(E>Speau|E<Sfond)
                  M0(i,j)=0;
              else
                  M0(i,j)=1;
              end

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par slaima15
    En plus de ça avec ce blkproc, comment je peux faire ce test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(E>Speau|E<Sfond)
        M0(i,j)=0;
    else
        M0(i,j)=1;
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    E = blkproc(P0,[1 1],[1 1],@energie); 
    M0 = (E<=Speau|E>=Sfond);
    Ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function [E]=energie(P0)
    E=(P0(1,1)^2+P0(1,2)^2+P0(1,3)^2+P0(2,1)^2+P0(2,2)^2+P0(2,3)^2+P0(3,1)^2+P0(3,2)^2+P0(3,3)^2)/9;
    Est correct, mais j'écrirais plutôt:

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    Avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    M0 = (E<=Speau|E>=Sfond);
    Je peux pas inverser les conditions car ils me donne pas les même résultats, est ce que je peux exprimer ça autrement en conservant les conditions?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par slaima
    Avec ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M0 = (E<=Speau|E>=Sfond);

    Je peux pas inverser les conditions car ils me donne pas les même résultats, est ce que je peux exprimer ça autrement en conservant les conditions?
    Oui petite étourderie (il se fait tard ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    M0 = (E<=Speau & E>=Sfond); 
    % Ou
    M0 = ~(E>Speau|E<Sfond);

Discussions similaires

  1. Réponses: 13
    Dernier message: 08/06/2009, 09h26
  2. Calcul Matriciel en PL/SQL
    Par PpPool dans le forum PL/SQL
    Réponses: 4
    Dernier message: 02/02/2004, 10h11
  3. Réponses: 2
    Dernier message: 23/12/2002, 20h34
  4. Ordre de parcours de l'arbre...
    Par Sylvain James dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 01/12/2002, 18h41
  5. arbre de parcour d'arborescence windows
    Par chupachoc dans le forum Composants
    Réponses: 7
    Dernier message: 09/09/2002, 08h09

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