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 :

reduire le temps de calcul


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut reduire le temps de calcul
    bonjour
    jai un probleme. dans mon code je travaille avec une grosse matrice de dimension 256*190*1000. le temps d'execution est hyper hyper lent. Que puis je faire svp pour reduire le temps d'execution. merci
    mon code est le suivant
    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
    for  h=1:100
     
          for m = 1:256
             for n = 1:190
        y=squeeze(Frame(m,n,(h-1)*10+1:h*10));
     
      logSI=log(y);
      sexpfit=polyfit(TE,logSI',1);
      if( -1/sexpfit(1) > 0 && -1/sexpfit(1) < 500 )
        counter0=counter0+1;
        M0(:,counter0)=exp(sexpfit(2));
        T2StarSExpFit(:,counter0)=-1/sexpfit(1);
        curMeanT2Star=-1/sexpfit(1);
      else
          continue;
      end

  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 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Pourrais-tu faire attention à poster un code complet fonctionnel ?

    Sinon dans ton cas, c'est la fonction POLYFIT qui 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function test
     
    Frame = rand(20,10,100);
    TE = 1:10;
    counter0 = 0;
     
    for  h=1:10
     
        for m = 1:20
            for n = 1:10
                y=squeeze(Frame(m,n,(h-1)*10+1:h*10));
     
                logSI=log(y);
                sexpfit=polyfit(TE,logSI',1);
                if( -1/sexpfit(1) > 0 && -1/sexpfit(1) < 500 )
                    counter0=counter0+1;
                    M0(:,counter0)=exp(sexpfit(2));
                    T2StarSExpFit(:,counter0)=-1/sexpfit(1);
                    curMeanT2Star=-1/sexpfit(1);
                else
                    continue;
                end
     
            end
     
        end
     
    end
    Puis un script pour évaluer le temps d'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    profile on
    profile -history
     
    test
     
    profile viewer
    (voir l'image attachée pour le résultat)

    Tu devrais la remplacer par une fonction MATLAB (à trouver sur le FEX ou à faire toi même) plus spécifique à ton problème (régression linéaire) voire par un fichier MEX.

    Pour l'exemple, on peut légèrement optimiser le code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for  h = 1:10
        for m = 1:20
            for n = 1:10
                y = Frame(m,n,(h-1)*10+1:h*10);
                sexpfit = polyfit(TE,log(y(:)),1);
                if( -1/sexpfit(1) > 0 && -1/sexpfit(1) < 500 )
                    counter0 = counter0+1;
                    M0(counter0) = exp(sexpfit(2));
                    T2StarSExpFit(counter0) = -1/sexpfit(1);
    %                 curMeanT2Star = -1/sexpfit(1);
                end     
            end 
        end 
    end
    On peut aussi pré-allouer la mémoire pour M0 et T2StarSExpFit en leur donnant une taille maximale (et en supprimant les termes inutiles à la fin du processus) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    M0 = nan(numel(Frame),1);
    T2StarSExpFit = nan(numel(Frame),1);
    Mais cela ne changera rien dans ton cas, puisque c'est la fonction POLYFIT qui prend le plus de temps.
    Images attachées Images attachées  
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    une grosse matrice de dimension 256*190*1000
    Une matrice à 3 dimensions, ça n'existe pas. Dans ton cas, ça doit plutôt être un tableau.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

Discussions similaires

  1. temps de calcul RSA
    Par othland dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 13/03/2006, 11h16
  2. Temps de calcul d'un algo
    Par Rémiz dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 23/12/2005, 13h52
  3. temps de calcul sius VC++ !!
    Par Axiome dans le forum MFC
    Réponses: 16
    Dernier message: 13/12/2005, 09h57
  4. Temps de calcul avec deux écrans
    Par Shaga dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/11/2005, 09h24
  5. temps de calculs extremement long !!
    Par salseropom dans le forum C++
    Réponses: 9
    Dernier message: 19/01/2005, 20h12

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