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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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

  8. #8
    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

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

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

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