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


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 12
    Par défaut Optimisation des boucles
    Bonjour,

    Je voulais voir si qqun avait une idée pour améliorer ce code. Les 2 premières boucles servent à rechercher dans une matrice 3D les éléments qui répondent aux conditions du FIND. Je mets le code ci-dessous pour que vous compreniez mieux.Ensuite, je fais une moyenne sur les éléments qui correspondent aux indices. Ce code s'exécute pendant 30min et je voudrais savoir s'il n'y a pas moyen de supprimer une ou 2 boucles pour gagner en rapidité.
    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
    for a=1:1:length(coordY)
     
        for b=1:1:length(coordX)
     
            [f g]=find(mat(:,2,:)>=(depla(a,b,1)-0.25)&mat(:,2,:)<(depla(a,b,1)+0.25)&mat(:,3,:)>=(depla(a,b,2)-0.25)&mat(:,3,:)<(depla(a,b,2)+0.25));
     
            if isempty(f)==0
     
                depla(a,b,3)=length(f)/freq_acq;
     
                hauteur=[];
                debit=[];
                vitesse=[];
                vvent=[];
                orientvent=[];
                orientnord=[];
     
                for j=1:1:length(f)
     
                    hauteur=[hauteur;mat(f(j),4,g(j))];
                    debit=[debit;mat(f(j),5,g(j))];
                    vitesse=[vitesse;mat(f(j),6,g(j))];
                    vvent=[vvent;mat(f(j),7,g(j))];
                    orientvent=[orientvent;mat(f(j),8,g(j))];
                    orientnord=[orientnord;mat(f(j),9,g(j))];
     
                end
     
                depla(a,b,4)=mean(hauteur);
                depla(a,b,5)=mean(debit);
                depla(a,b,6)=mean(vitesse);
                depla(a,b,7)=mean(vvent);
                depla(a,b,8)=mean(orientvent);
                depla(a,b,9)=mean(orientnord);
     
            end
     
        end
     
    end
    D'avance je vous remercie

  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
    Pourrais-tu attacher un fichier mat (en zip) contenant les variables mat, depla et freq_acq ?

    Si possible des variables de taille réduite... faire des tests pendant 30 minutes, c'est pas super

    coordX et coordY sont les dimensions maximales de depla, c'est ça ?

  3. #3
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 12
    Par défaut
    La freq_acq est égale à 200. Les coordX et les coordY sont bien les dimensions maximales de depla. J'ai mis les 2 autres variables en fichier attaché. La variable depla a sa taille normale par contre la variable mat a en théorie les dimensions suivantes (8794,9,54).
    Fichiers attachés Fichiers attachés

  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
    Essaie ceci avec une matrice mat (mx9xn) :

    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
    % On change modifie mat (mx9xn) afin d'obtenir 9 matrices M (mxn)
    for n=9:-1:1
       M{n} = squeeze(mat(:,n,:));
       mat(:,n,:) = [];    
    end
     
    % Préallocation de mémoire pour depla
    depla(end,end,9) = 0;
     
    coordY = size(depla,1);
    coordX = size(depla,2);
     
    freq_acq = 200;
     
    for a = 1:coordY
        for b = 1:coordX
     
            % Idexage logique
            idx = M{2}>=(depla(a,b,1)-0.25) & M{2}<(depla(a,b,1)+0.25) & M{3}>=(depla(a,b,2)-0.25) & M{3}<(depla(a,b,2)+0.25);
     
            if any(idx(:))
     
                % indexage logique vectorisé
                depla(a,b,3) = sum(idx(:))/freq_acq;     
                depla(a,b,4) = mean(M{4}(idx(:)));
                depla(a,b,5) = mean(M{5}(idx(:)));
                depla(a,b,6) = mean(M{6}(idx(:)));
                depla(a,b,7) = mean(M{7}(idx(:)));
                depla(a,b,8) = mean(M{8}(idx(:)));
                depla(a,b,9) = mean(M{9}(idx(:)));
     
            end
        end
    end
    Vérifie bien les résultats contenus dans depla

  5. #5
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 12
    Par défaut
    Merci beaucoup. Ce code fonctionne parfaitement. Le temps mis pour l'exécution du code passe de 1912s à 673s grâce à ton code. C'est déjà mieux. En voyant ton code, je me posais 2 questions. Il est préférable en général de travailler avec des cellules plutôt qu'avec des matrices 3D? Et vaut mieux au fur et à mesure supprimer les matrices dont on ne se sert plus comme t'as fait avec la matrice mat?

  6. #6
    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 Programmeurfou Voir le message
    Il est préférable en général de travailler avec des cellules plutôt qu'avec des matrices 3D?
    Le tableau de cellules M n'est pas forcément utile.
    Il était aussi possible de permuter les dimensions 2 et 3 de mat, et de travailler sur cette dernière dimension (mat(:,:,1) mat(:,:,2) ...)

    En fait, tout s'articule autour des méthodes d'indexage linéaire et logique (http://briot-jerome.developpez.com/m...sgestion/#LIII)

    A partir de la, c'est plus facile de travailler sur des matrices (ou des sous-matrices) mxnx1

    Ce qui était principalement gênant avec ton code, c'est que tu travaillais sur les colonnes de mat (mat(:,1,:) mat(:,2,:) ...)

    Citation Envoyé par Programmeurfou Voir le message
    Et vaut mieux au fur et à mesure supprimer les matrices dont on ne se sert plus comme t'as fait avec la matrice mat?
    C'est juste pour faciliter la gestion de la mémoire par MATLAB.

    MATLAB ne sait pas fractionner les matrices en mémoire. Il les stocks dans des blocs contigus. Donc, même si tu as le double de mémoire disponible, ça ne veut pas dire que tu pourras stocker deux fois la même matrice

    => http://briot-jerome.developpez.com/m...gestion/#LII-D

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

Discussions similaires

  1. Optimiser des boucles
    Par shimuno dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/03/2015, 17h48
  2. Optimisation des boucles
    Par mayssaMM dans le forum Images
    Réponses: 3
    Dernier message: 30/07/2013, 18h22
  3. Optimisation des boucles for
    Par Kikouyou1080 dans le forum Général Python
    Réponses: 5
    Dernier message: 04/06/2010, 18h16
  4. optimisation des boucles
    Par fiboulle dans le forum C
    Réponses: 0
    Dernier message: 26/02/2010, 14h51
  5. [PHP-JS] Optimisation du code avec des boucles
    Par jiojioforever dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2007, 17h02

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