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 :

Optimisation du code


Sujet :

MATLAB

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut Optimisation du code
    Bonjour,

    je souhaiterais optimiser un morceau de code (boucles for). Je sais que l'on peut utiliser la fonction interp2 pour gagner en temps de calcul. Cependant, je ne vois pas trop comment faire. Pouvez-vous m'aider?

    voici le morceau de code:
    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
     
     
    for gy = 0:stepy:1
        for gx = 0:stepx:1
     
            A = [g*gx-a h*gx-b ; g*gy-d h*gy-e];
            B = [c-gx;f-gy];
            xy = A\B;
     
            i = (Ni+1)-floor(Ni*xy(2));
            j = floor(Nj*xy(1))+1;
     
            i1 = (Nii+1)-floor(Nii*gy);
            j1 = floor(Njj*gx)+1;
     
            G(i1,j1) = I(i,j);
     
        end
    end
    Merci d'avance.

    JP

  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 317
    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 317
    Par défaut
    As-tu conservé la préallocation de mémoire pour G comme j'avais fais avec image_final dans l'autre discussion ici ?

    Sinon, as-tu utilisé le profiler pour savoir quelles étaient les lignes gourmandes en temps de calcul ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    J'ai utilisé profiler et il me dit que c'est le calcul de, dans l'ordre, A, B et xy qui prennent le plus de temps de calcul. Cependant, j'ai vue qu'avec interp2 on pouvait gagner du temps mais je ne sais pas trop l'utiliser.

    rem: G est initialisé au début des 2 boucles for : G = zeros(Nii,Njj,'uint8');

    JP

  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 317
    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 317
    Par défaut
    Citation Envoyé par jp_developpeur Voir le message
    J'ai utilisé profiler et il me dit que c'est le calcul de, dans l'ordre, A, B et xy qui prennent le plus de temps de calcul.
    Tu peux déjà simplifier la résolution de ce système de deux équations à deux inconnues qui n'a pas besoin du backslash \. Tu peux faire les simplification à la main en posant le problème sur une feuille de papier.

    Ensuite, si le code n'est toujours pas suffisamment rapide, pour accélerer le calcul, tu essayeras de le vectoriser en utilisant MESHGRID pour générer des tableaux contenant tous les couples gx*gy et effectuer directement les calcul sur les tableaux entiers, plutôt que élément par élément

    Enfin, tu pourras éventuellement essayer de faire un fichier MEX en recodant les deux boucles FOR-END en C ou en Fortran

    Mais je te conseille de commencer par la première suggestion et d'évoluer pas à pas en comparant rigoureusement les temps de calcul

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    C'est sûr pour la variable xy mais ce qui prend beaucoup de temps de calcul, c'est le calcul du A avec les multiplications: g*gx,...

    JP

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    En faisant ce que tu m'as dit, j'ai diminué le temps de traitement. Cependant, je me demande si je peux encore le diminuer d'avantage. Voici ce que j'obtiens avec profiler:

    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
    25
    26
    27
    28
    29
    7   96 for gy = 0:stepy:1 
              1232   97     for gx = 0:stepx:1 
                     98 
                     99 %         A = [g*gx-a h*gx-b ; g*gy-d h*gy-e];
                    100 %         B = [c-gx;f-gy];
                    101 %         
                    102 %         xy = A\B
                    103         
      0.09  184800  104         a1 = g*gx-a; 
      0.08  184800  105         a2 = h*gx-b; 
      0.08  184800  106         a3 = g*gy-d; 
      0.05  184800  107         a4 = h*gy-e; 
                    108         
      0.11  184800  109         b1 = c-gx; 
      0.08  184800  110         b2 = f-gy; 
                    111         
      0.06  184800  112         denominateur = a2*a3-a1*a4; 
      0.26  184800  113         xy = [(b2*a2-b1*a4)/denominateur;(b1*a3-b2*a1)/denominateur]; 
                    114         
      0.06  184800  115         i = (Ni+1)-floor(Ni*xy(2)); 
      0.09  184800  116         j = floor(Nj*xy(1))+1; 
                    117         
      0.06  184800  118         i1 = (Nii+1)-floor(Nii*gy); 
      0.06  184800  119         j1 = floor(Njj*gx)+1; 
                    120 
      0.02  184800  121        G(i1,j1) = I(i,j); 
                    122 
      0.03  184800  123     end 
              1232  124 end
    JP

  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 317
    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 317
    Par défaut
    Tu n'as pas besoin de créer le vecteur xy.

    Tu peux directement remplacer xy(1) et xy(2) par leurs valeurs

    Mais comme je te l'ai dit dès le début, pense à sauvegarder chaque programme optimisé pour pouvoir comparer de façon rigoureuse les résultats donnés et les temps de calcul

    Par exemple, combien de temps as-tu économisé en te passant du backslash ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    C'est ce que je fais à chaque fois. Pour le moment, j'ai divisé le temps pratiquement par 2.
    Cependant, il y a quelques chose que je ne comprends pas car le temps de calcul augmente lorsque je fais tic toc dans la boucle (toc a l'exterieur). Puis diminue d'un coup et réaugmente. voir ci-dessous les valeurs des 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Elapsed time is 0.372657 seconds.
    Elapsed time is 0.122317 seconds.
    Elapsed time is 0.104462 seconds.
    Elapsed time is 0.110359 seconds.
    Elapsed time is 0.112053 seconds.
    Elapsed time is 0.117821 seconds.
    Elapsed time is 0.127225 seconds.
    Elapsed time is 0.136059 seconds.
    Elapsed time is 0.139336 seconds.
    Elapsed time is 0.144612 seconds.
    Elapsed time is 0.153246 seconds.
    Elapsed time is 0.156878 seconds.
    Elapsed time is 0.162673 seconds.
    Elapsed time is 0.169030 seconds.
    Elapsed time is 0.180133 seconds.
    Elapsed time is 0.181617 seconds.
    Elapsed time is 0.188091 seconds.
    Elapsed time is 0.199036 seconds.
    Elapsed time is 0.206972 seconds.
    Elapsed time is 0.208885 seconds.
    Elapsed time is 0.215128 seconds.
    Elapsed time is 0.221897 seconds.
    Elapsed time is 0.227565 seconds.
    Elapsed time is 0.237137 seconds.
    Elapsed time is 0.239007 seconds.
    Elapsed time is 0.245662 seconds.
    Elapsed time is 0.252002 seconds.
    Elapsed time is 0.258162 seconds.
    Elapsed time is 0.265731 seconds.
    Elapsed time is 0.270863 seconds.
    Elapsed time is 0.282441 seconds.
    Elapsed time is 0.288474 seconds.
    Elapsed time is 0.292513 seconds.
    Elapsed time is 0.296090 seconds.
    Elapsed time is 0.300383 seconds.
    Elapsed time is 0.307657 seconds.
    Elapsed time is 0.312097 seconds.
    Elapsed time is 0.324060 seconds.
    Elapsed time is 0.327057 seconds.
    Elapsed time is 0.339011 seconds.
    Elapsed time is 0.339069 seconds.
    Elapsed time is 0.345974 seconds.
    Elapsed time is 0.349032 seconds.
    Elapsed time is 0.362615 seconds.
    Elapsed time is 0.360228 seconds.
    Elapsed time is 0.366135 seconds.
    Elapsed time is 0.370697 seconds.
    Elapsed time is 0.379308 seconds.
    Elapsed time is 0.385556 seconds.
    Elapsed time is 0.392879 seconds.
    Elapsed time is 0.396954 seconds.
    Elapsed time is 0.405993 seconds.
    Elapsed time is 0.410909 seconds.
    Elapsed time is 0.416947 seconds.
    Elapsed time is 0.423750 seconds.
    Elapsed time is 0.430235 seconds.
    Elapsed time is 0.437571 seconds.
    Elapsed time is 0.074956 seconds.  //diminue ici
    Elapsed time is 0.082161 seconds.
    Elapsed time is 0.087554 seconds.
    Elapsed time is 0.095723 seconds.
    Elapsed time is 0.101150 seconds.
    Elapsed time is 0.107327 seconds.

    Je ne sais pas si j'ai été assez clair. Dis le moi autrement. J'ai fais un clear de toutes mes données mais c'est toujours pareil.

    JP

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Pour tester le temps d'exécution d'un code, il faut déjà qu'il soit écrit dans une fonction.

    Ensuite, on appelle plusieurs fois la fonction dans une boucle FOR-END, on stocke chaque temps et on fait la moyenne.

    Il faut aussi faire attention à ce qu'aucun autre process ne viennent perturber l'exécution du programme

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    Salut,

    Merci pour ta réponse. Mais autrement, pour éliminer les 2 boucles FOR peut-on utiliser la fonction interp2? Et si oui, comment. Je l'ai déjà utiliser si je remplis une image en valeur de pixels mais pas quand on a des équations dedans.

    Merci

    JP

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut Problème avec la fonction interp2
    Le code se situe dans le lien suivant:http://www.developpez.net/forums/d70...misation-code/

    J'ai essayé d'effectuer les modifications nécessaire mais je suis bloqué sur les différents pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [X1,Y1]=meshgrid(1:1:Njj+1,1:1:Nii+1); %pour i1 et j1
    [X,Y] = meshgrid(???,???)  %pour i,j
    G = interp2(X,Y,I(1:1:end,1:1:end),X1,Y1,'spline');
    Pouvez-vous m'aider?

    Merci

  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 317
    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 317

  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 317
    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 317
    Par défaut
    Sinon, je ne vois pas bien ce que viens faire INTERP2 ici ?

    Comment vas-tu y intégrer les paramètres xy ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    Merci, mais cela ne m'aide pas beaucoup. J'ai trouvé des exemples pour interpoler deux images entre elles. Cependant, mon problème consiste à faire interagir les équations, c'est-à-dire à bien trouver les pas pour générer les 2 grilles d'interpolation afin d'obtenir au final, l'interpolation des valeurs des pixels de l'image initiale vers l'image finale. Sinon le principe, je l'ai compris. mais avec ce genre de problème (images de dimension différentes et pas la même géométrie (trapèze vers rectangle ou carré)), je bloque.

    JP

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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