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 :

Utilisation des "sparse matrices" pour accroître la vitesse d'execution


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Utilisation des "sparse matrices" pour accroître la vitesse d'execution
    Bonjour à tous

    je dois executer l'instruction suivante un grand nombre de fois

    r2c(:,ones(1,nc)).*Y_2c

    r2c est un vecteur colonne, que je réplique nc fois pour qu'il ait la même dimension que Y_2c.

    Y_2c (de l'ordre de 300x300) est pleine de 0 (en moyenne j'ai quatre éléments non nuls par ligne !!!). J'avais donc pensé utiliser sparse(Y_2c) pour gagner en temps de calcul.

    J'obtiens le résultat inverse avec une augmentation du temps d'execution d'environ 1/4 !!!

    J'avoue que cela me laisse pantois.

    Merci d'avance pour vos suggestions.

  2. #2
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    A mon avis, le but de sparse n'est pas de diminuer le temps d'execution, mais pour réduir la taille des gros matrices en mémoire.
    et en générale, lorsqu'on gagne en mémoire, on perd en temps, et inversement.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    c'est parce que le temps dépend du mode de stockage de la matrice spare, c'est pour ca que ca augmente un peu. Je crois qu'elles sont stockées par colonne si mes souvenirs sont bon , donc il faut utiliser des parcours par colonne.

    Mais ta matrice est petite , j'ai bossé avec des matrices creuses de 100 000 variable, c'est ca que j'appelle grande , car là, ca devient très intéressant et indispensable de bosser avec des matrices spares.

    Par contre, je ne vois pas bien ce que fait ta ligne
    r2c(:,ones(1,nc)).*Y_2c
    pourquoi il y a un ., c'est pour élément par élément ca?

  4. #4
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    Citation Envoyé par divlys
    pourquoi il y a un ., c'est pour élément par élément ca?
    oui c'est ça

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    donc r2c et Y_2c doivent être des matrices de même taille ou r2c scalaire

    mais c'est quand même bizarre, les indices de colonnes de r2c
    r2c(:,ones(1,nc))

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    C'est juste une technique qui est conseillée dans l'aide pour répliquer une matrice (cf code de repmat).

    nc est le nombre de colonne de Y_2c.
    et r_2c est un simple vecteur colonne. L'instruction permet de genérer une matrice de nc colonnes toutes identiques à r_2c.

    Je suis bien d'accord que cette instruction est assez étrange mais elle est très rapide.


    Pour répondre à divlys, certes ma matrice n'est pas colossale mais elle doit être recalculée environ 5000 fois à chaque fois que j'execute mon code.

    Comme ce même code doit être inclus dans une routine d'optimisation (-> ececution de l'instruction plusieurs centaines de milliers de fois), chaque ms gagnée sur cette instruction a un effet important sur mon temps de calcul global.

    Si vous pensez qu'une autre structure serait plus efficace, je serai très heureux de l'essayer.

    Merci d'avance

  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 307
    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 307
    Points : 52 887
    Points
    52 887
    Par défaut
    As-tu utilisé PROFILE pour analyser le temps d'exécution de ton code ?
    Pour être sur qu'il n'y a pas d'autres endroits à optimiser.

    De plus, si ton code n'est pas trop long (et si il n'y a pas de problème de droit) peux-tu nous le montrer ?

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    La fonction kernel est appelée par ode15s.
    En gros, c'est pour faire de la chimie, les temps d'execution sont indiqués juste en dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function dcdt = Kernel(t,c,C_ic,Y_ic,k_ic,C_1c,Y_1c,k_1c,C_2c,Y_2c,k_2c,nc) %1
     
    ric =k_ic.*c(C_ic).^2; %2
    ER_ic=sum(ric(:,ones(1,nc)).*Y_ic); %3
    r1c =k_1c.*c(C_1c); %4
    ER_1c=sum(r1c(:,ones(1,nc)).*Y_1c); %5
    r2c =k_2c.*c(C_2c(:,1)).*c(C_2c(:,2)); %6
    ER_2c=sum(r2c(:,ones(1,nc)).*Y_2c); %7
     
    dcdt=transpose(sum([ER_ic;ER_1c;ER_2c])); %8
    ----Temps (Ubuntu 7.04 - Matlab 7.4 - Pent M 1.4Ghz 512 Mb)

    Kernel executé 4030 fois

    2/ negligible
    3/ 0.350 s
    4/ negligible
    5/ 1.689 s
    6/ 0.298 s
    7/ 7.111 s
    8/ 0.337 s
    Les tailles des matrices pour ce test
    Y_2c: 254*233

    Y_1c: 75*233

    Y_ic: 7*233
    J'espère que cela aide

  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 307
    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 307
    Points : 52 887
    Points
    52 887
    Par défaut
    Quelle version de Matlab utilises-tu ?

    Mais au fait, en relisant la discussion, je me demande vraiment ce que tu gagnes en utilisant des matrices sparses ici ? Est-ce vraiment significatif par rapport à des matrices full ? Vu la taille de tes matrices, j'en doute ?

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 307
    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 307
    Points : 52 887
    Points
    52 887
    Par défaut
    As-tu aussi essayé la préallocation de mémoire ?

    Quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function dcdt = Kernel(t,c,C_ic,Y_ic,k_ic,C_1c,Y_1c,k_1c,C_2c,Y_2c,k_2c,nc) %1
     
    ER=zeros(...,...);
     
    ric =k_ic.*c(C_ic).^2; %2
    ER(...,...)=sum(ric(:,ones(1,nc)).*Y_ic); %3
    r1c =k_1c.*c(C_1c); %4
    ER(...,...)=sum(r1c(:,ones(1,nc)).*Y_1c); %5
    r2c =k_2c.*c(C_2c(:,1)).*c(C_2c(:,2)); %6
    ER(...,...)=sum(r2c(:,ones(1,nc)).*Y_2c); %7
     
    dcdt=transpose(sum(ER)); %8
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function dcdt = Kernel(t,c,C_ic,Y_ic,k_ic,C_1c,Y_1c,k_1c,C_2c,Y_2c,k_2c,nc) %1
     
    ER=zeros(...,...);
     
    ric =k_ic.*c(C_ic).^2; %2
    ER(...,...)=(ric(:,ones(1,nc)).*Y_ic); %3
    r1c =k_1c.*c(C_1c); %4
    ER(...,...)=(r1c(:,ones(1,nc)).*Y_1c); %5
    r2c =k_2c.*c(C_2c(:,1)).*c(C_2c(:,2)); %6
    ER(...,...)=(r2c(:,ones(1,nc)).*Y_2c); %7
     
    dcdt=transpose(sum(ER)); %8
    Il faut bien sur adapter ces solutions aux dimensions des matrices dans le code

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par sombrero2003
    C'est juste une technique qui est conseillée dans l'aide pour répliquer une matrice (cf code de repmat).

    nc est le nombre de colonne de Y_2c.
    et r_2c est un simple vecteur colonne. L'instruction permet de genérer une matrice de nc colonnes toutes identiques à r_2c.

    Je suis bien d'accord que cette instruction est assez étrange mais elle est très rapide.
    merci pour l'info, c'est intéressant

    Citation Envoyé par sombrero2003
    Pour répondre à divlys, certes ma matrice n'est pas colossale mais elle doit être recalculée environ 5000 fois à chaque fois que j'execute mon code.

    Comme ce même code doit être inclus dans une routine d'optimisation (-> ececution de l'instruction plusieurs centaines de milliers de fois), chaque ms gagnée sur cette instruction a un effet important sur mon temps de calcul global.
    (lol, j'adorre l'optimisation, j'ai fait les maths appliquées, j'étais spécialisée en optimisation non linéaire et en analyse numérique , mais ca commence à dater)
    c'est ton nombre d'itération qu'il faut diminuer, je crois que tu vas avoir du mal à gagner sur le temps d'une itération car il est trop court et tes matrices sont trop petites. Tu peux tester des petits trucs, c'est la seule chose à faire je pense
    bonne continuation dans ton travail

Discussions similaires

  1. Réponses: 18
    Dernier message: 10/06/2012, 23h06
  2. Réponses: 0
    Dernier message: 28/12/2011, 15h42
  3. macro pour calculer la vitesse d'execution d'une macro
    Par victorzecat dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/12/2007, 14h34
  4. utiliser des morceaux d'une image pour faire des boutons
    Par Battosaiii dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 14/12/2005, 00h05

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