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 :

Problème de vitesse


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut Problème de vitesse
    Bonjour à tous,

    je m'appelle Romain, je suis nouveau dans ce forum dans lequel je fonde beaucoup d'espoir.

    J'ai un problème de vitesse sur un programme que je n'arrive pas à résoudre.

    Je vous explique :

    Je dois, à partir d'un fichier .htr, reconstituer des matrices. Je pense que le plus simple reste de vous présenter le programme et de vous joindre le fichier avec, malheureusement le fichier .htr fait 6Mo, je n'y suis donc pas arrivé. Le programme fonctionne mais s'exécute en une dizaine de sec...

    Je voudrais faire ça en un claquement de doigt...

    Voici un exemple que j'ai trouvé sur le net :
    http://www.cs.wisc.edu/graphics/Cour...f/Example1.htr

    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
     
    clear all;
    close all;
    clc;
     
    filename = 'blg2yzx.htr';
     
    NumSegments = dlmread(filename,'','B7..B7');
    NumFrames = dlmread(filename,'','B8..B8');
     
    k=0;
    Data_Base_position = dlmread(filename,'',strcat('B',int2str(NumSegments + 20),'..H',int2str(NumSegments*2-1 + 20)));
     
    m=0;
    j=0;
    t=1;
    data = zeros(6*NumSegments,7);
     
    for j=0:1:2 % Normalement le 2 devrait être NumFrames
        for b = 0:3002:3002*NumSegments-1
            data(t,:) = dlmread(filename,'',strcat('B',int2str(NumSegments*2 + 20+4+b+j),'..H',int2str(NumSegments*2 + 20+4+b+j)));
            t=t+1;
        end
    end
     
    data = vertcat(Data_Base_position , data)
    fclose('all');
    Si vous avez besoin de plus d'explication (car je n'ai en fait rien dit... mais je pense que c'est parlant) n'hésiter pas à me demander !

    Merci à tous par avance
    Romain

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Je pense que tu aurais intérêt à jeter un oeil à la fonction TEXTSCAN.

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci de ta réponse rapide,

    Si je comprends bien tu es en train de me dire que c'est la fonction en elle même qui lente ? Et tu pense que textscan est plus rapide ? car je l'ai déjà utilisé et je n'en suis pas sûr.

    pour être plus claire je vais détailler un peu :

    je cherche à reconstituer l'image (par des simples traits) d'un squelette. Pour cela je dispose d'un fichier .htr, issu d'un logiciel de Motion Capture. Ce fichier est composé d'un préambule et d'un corps. Pour reconstituer mon image, je cherche dans un premier temps à retourner des matrices correspondantes à la position des os ( x y z alpha beta gamma lenght) pour une frame. Pour animer mon image j'ai besoin que cette matrice soit rafraichie avec les nouvelles données pour la frame suivante.

    Seulement comme vous avez pu le voir dans l'exemple, seul la position de base est organisé correctement, pour les frames suivantes, je dois reconstituer la matrice ce qui veut dire aller chercher les informations pour chaque os !

    J'espère avoir été plus claire...

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    En fait il faudrait tester.

    Je ne suis pas sur que TEXTSCAN soit plus rapide que DLMREAD mais elle doit permettre d'optimiser le code, peut-être même de supprimer une boucle ce qui devrait améliorer les performances du code.

    P.S. Ton code ne fonctionne pas tel quel avec l'exemple que tu as donné, mais je suppose que c'est du au fait que l'exemple est légèrement différent de ton fichier.
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  5. #5
    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 160
    Points
    53 160
    Par défaut
    Une première idée pour automatiser la lecture :

    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
    fname = 'Example1.htr';
     
    fid = fopen(fname,'rt');
     
    str = fgetl(fid);
    str = fgetl(fid);
    while ~strncmp(str,'[SegmentNames&Hierarchy]',24)
     
        [name,value] = strread(str,'%s%s%*s','commentstyle','shell');
        if all(isstrprop(value{1},'digit'))
            H.(name{1}) = str2double(value{1});
        else
            H.(name{1}) = value{1};
        end
        str = fgetl(fid);
    end
     
    str = fgetl(fid);
    str = fgetl(fid);
     
    n = 1;
    while ~strncmp(str,'[BasePosition]',14)
     
        [child(n),parent(n)] = strread(str,'%s%s');
        n = n+1;
        str = fgetl(fid);
     
    end
     
    str = fgetl(fid);
    str = fgetl(fid);
     
    while ~strncmp(str,'[',1)
        [segmentname, Tx, Ty, Tz, Rx, Ry, Rz, BoneLength] = strread(str,'%s%f%f%f%f%f%f%f');
        Segment.(segmentname{1}) = [Tx, Ty, Tz, Rx, Ry, Rz, BoneLength];
        str = fgetl(fid);
    end
     
    fclose(fid);
     
    X = textread(fname,'%s','delimiter','\n','commentstyle','shell');
     
    f = fieldnames(Segment);
    idx = find(strcmp(X,sprintf('[%s]',f{1})),1,'first')-1;
     
    for n = 1:numel(f)
     
        M{n} = str2num(char(X(((n-1)*(H.NumFrames+1)+2:n*(H.NumFrames+1))+idx)));
     
    end
    Ce qui donne :
    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
    >> H
     
    H = 
     
                   FileType: 'htr'
                   DataType: 'HTRS'
                FileVersion: 1
                NumSegments: 18
                  NumFrames: 2
              DataFrameRate: 30
         EulerRotationOrder: 'ZYX'
           CalibrationUnits: 'mm'
              RotationUnits: 'Degrees'
        GlobalAxisofGravity: 'Y'
             BoneLengthAxis: 'Y'
    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
    >> Segment
     
    Segment = 
     
        LOWERTORSO: [0 0 0 0 0 0 200]
        UPPERTORSO: [0 200 0 -1.3800 0 0.3500 286.9500]
              NECK: [0 286.9500 0 2.9000 -0.0800 3.2000 101.6600]
              HEAD: [0 101.6600 0 -1.5300 -0.0900 -3.5500 174]
         RSHOULDER: [-10.2100 252.0200 -0.8400 1.8500 -1.3600 98.7600 137.5000]
         RUPPERARM: [0 137.5000 0 3.2200 0.4800 13.4200 279.0700]
           RLOWARM: [0 279.0700 0 -2.4200 -1.4000 -15.4800 222.6400]
             RHAND: [0 222.6400 0 -2.5900 -0.3200 -6.9800 90]
         LSHOULDER: [9.7900 251.9000 -0.8400 -5.3000 1.3600 -98.6300 132.7900]
         LUPPERARM: [0 132.7900 0 13.4600 1.2100 -13.6700 295.1700]
           LLOWARM: [0 295.1700 0 -6.6000 2.6500 18.0400 222.8100]
             LHAND: [0 222.8100 0 -1.4900 0.1000 3.7800 90]
            RTHIGH: [-96.4900 -31.4100 26.8900 -6.1500 0 176.1700 379.1700]
           RLOWLEG: [0 379.1700 0 4.8600 -0.1400 1.3400 394.6000]
             RFOOT: [0 394.6000 0 71.4000 -0.0600 2.4800 160]
            LTHIGH: [107.9000 -45.3600 2.8400 -4.8100 0 -178.6900 362.8500]
           LLOWLEG: [0 362.8500 0 5.0600 -0.0300 0.3000 398.3600]
             LFOOT: [0 398.3600 0 69.8700 -0.0100 -1.6100 160]
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >> M{1}
     
    ans =
     
       1.0e+03 *
     
        0.0010    0.2637    0.8162   -2.8748    0.0180   -0.0077   -0.0103    0.0010
        0.0020    0.2644    0.8124   -2.7403    0.0198   -0.0135   -0.0119    0.0010
    Pour le moment, je n'ai pas cherché à optimiser le temps de lecture.

    Qu'en est-il avec ton fichier ?
    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)

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    merci à tous pour votre contribution,

    j'ai réussi à trouver une solution répondant à mon problème qui, je le rappel, était la vitesse.

    Pour ceux que ca intéresse, j'ai choisis de loader le fichier en entier dans Matlab avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fid = fopen(filename,'rt'); 
    %
    format = '%s %s %s %s %s %s %s %s' ;
    rus = textscan(fid,format);
    rus1 = [rus{:}] 
    %
    fclose(fid);
    Et donc d'effectuer le traitement des données à postériori...

    En passant, mon fichier fait au alentour de 6 Mo, et occupe après chargement dans Matlab un tableau de 8128 lignes * 8 colonnes. Connaissez-vous la limite de l'overload memory ?

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Points : 107
    Points
    107
    Par défaut
    hardware limit sous WX 64bits / Unix ..
    2 ou 3 Go avec XP 32 bits, vista et 7 je sais plus

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Je remercie beaucoup tous les participants de cette conversation. Les réponses que vous m'avez fournis m'ont permis de terminé ce que j'avais entrepris.

    Un grand merci !

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

Discussions similaires

  1. [SDL] Problème de vitesse
    Par Hybrix dans le forum Développement 2D, 3D et Jeux
    Réponses: 26
    Dernier message: 06/01/2007, 23h31
  2. Problème de vitesse d'execution
    Par Samyhijodelaluna dans le forum MFC
    Réponses: 31
    Dernier message: 17/05/2006, 12h41
  3. [Son] problème de vitesse
    Par glloq8 dans le forum Composants
    Réponses: 6
    Dernier message: 13/02/2006, 15h45
  4. [debutant][c++] Problème de vitesse de déplacement
    Par bornibus dans le forum OpenGL
    Réponses: 15
    Dernier message: 26/02/2005, 10h16
  5. [OpenGL] Problème de Vitesse d'éxécution
    Par stick059 dans le forum OpenGL
    Réponses: 9
    Dernier message: 19/11/2004, 14h57

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