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

Images Discussion :

comment réduire le temps d'execution de mon programme ?


Sujet :

Images

  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 : 38

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut comment réduire le temps d'execution de mon programme ?
    Bonjour à tous
    voilà j'ai un grooos soucie, j'ai lancé un programme Matlab et ça fait presque deux heures que j'attend sans aucun résultat, je suis au bord de la crise de nerfs , je sais même pas si il boucle infiniment
    j'utilise une image à niveau de gris 121*181 je comprend pas pourquoi ça prend aussi longtemps..??
    quelqu'un aurait-il une astuce pour réduire ce temps..?
    Merci d'avance
    Voici le code pour avoir une idée:
    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
     
    function Ma = Bas (sigma,X);
    [nbrows,nbcols] = size(X);
    Ma = 0;
    for p=1:nbrows
        for q=1:nbcols
       for a=1:nbrows
           for b=1:nbcols
               A = [X(a,b),a,b];
               B = [X(p,q),p,q];
               v = distance (A,B);
               noyeau = (1/(2*pi*sigma*sigma)) * exp ((v*v)/(-2*sigma*sigma));
               Ma=Ma+noyeau;
           end
       end  
         end
    end 
    end
    et le code de distance est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function dis = distance(A,B);
    n = length (A);
    com = 0;
    for i=1:n
        Cal = (A (i)-B (i))*(A (i)-B (i));
        com = com + Cal;
    end
    dis = sqrt (com);
    end

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    c'est à cause de toutes tes boucles for que le calcul prend du temps.

    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
    function Ma = Bas (sigma,X);
    [nbrows,nbcols] = size(X);
    Ma = 0;
    for p=1:nbrows
        for q=1:nbcols
            for a=1:nbrows
                for b=1:nbcols
                    A = [X(a,b),a,b];
                    B = [X(p,q),p,q];
                    v = distance (A,B);
                    noyeau = (1/(2*pi*sigma*sigma)) * exp ((v*v)/(-2*sigma*sigma));
                    Ma=Ma+noyeau;
                end
            end
        end
    end
    end
    Les calculs effectués dans les boucle for en rouge peuvent être vectorisé, il suffit de bien construire les matrices qui vont permettre de faire ces calculs.

  3. #3
    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 : 38

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut
    Salut Magelan

    Merci pour ton aide, mais au risque de te décevoir qu'est-ce que la vectorisation, je suis débutante en Matlab et c'est la première fois que j'entends parlais de ça...?
    au fait, il a finit par me faire le calucle mais après presque 2h30

  4. #4
    Invité
    Invité(e)
    Par défaut
    C'est une façon d'éviter des boucles. Un exemple avec le code de ta distance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    com = 0
    for i=1:n
        Cal = (A (i)-B (i))*(A (i)-B (i));
        com = com + Cal;
    end
    Remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    com = sum((A-B).*(A-B));
    dis = sqrt(com);
    Le plus souvent on utilise les indexages linéaires et logiques.
    Tu pourras trouver un bon nombre d'exemples en faisant une recherche sur le forum.

  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 : 38

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    C'est une façon d'éviter des boucles. Un exemple avec le code de ta distance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    com = 0
    for i=1:n
        Cal = (A (i)-B (i))*(A (i)-B (i));
        com = com + Cal;
    end
    Remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    com = sum((A-B).*(A-B));
    dis = sqrt(com);
    Bonsoir winjerome
    c'est vraiment impressionnant, c'est un gain de temps considérable...!
    juste une question : pour une débutante comme moi es ce facile d'apprendre cette vectorisation...

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    C'est surtout une question d'habitude, comme l'a dit Winjerome, tu trouveras de nombreux exemples sur le forum.

    Un autre lien (en anglais) :
    1109 - Code Vectorization Guide

  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 : 38

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut
    Merci Magelan pour ton lien, je vais essayé de comprendre ca..

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/08/2007, 04h02
  2. Réponses: 3
    Dernier message: 31/08/2006, 17h11
  3. Réponses: 5
    Dernier message: 19/06/2006, 23h54
  4. Réponses: 5
    Dernier message: 12/05/2006, 12h45
  5. comment calculer le temps d'execution
    Par passion_info dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/06/2005, 10h13

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