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 :

Multiplication matrices sparse - lent


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Multiplication matrices sparse - lent
    Bonjour,

    Dans un algo je dois multiplier trois matrices A*Delta*B, qui sont toutes trois des matrices binaires. A et B sont définies en tant que 'sparse', mais si je définis également Delta en tant que 'sparse', l'exécution prend deux fois plus de temps. Or toutes ces matrices sont effectivement creuses dans les faits.

    Quelqu'un aurait-il une idée de la cause de cette lenteur ?

    Merci d'avance

    PS : J'utilise Matlab R2009b

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    aurais-tu un exemple de code simple qui reproduit ce comportement?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Voici un bout du code que j'utilise :

    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 i=1:N
        for j=i:N
            A=sparse(G(i).am); %matrice d'adjacence d'un graphe
            B=sparse(G(j).am);
     
            LA=repmat(LabA,1,size(LabB,1)); %LabA :labels des noeuds du grapheA
            LB=repmat(LabB',size(LabA,1),1);
            Delta=(LA==LB); % comparaison binaire des labels
     
            SMat=Delta+alpha*(A*Delta*B)+alpha*(A^2*Delta*B^2);
     
            V=sum(SMat(:)); 
            S(i,j)=V;
        end
    end
    Pour info, la taille des matrices va jusque 5000x5000.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    As-tu essayé de convertir ta matrice Delta en sparse? Voir ce message qui pourrais expliquer cette lenteur.

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    En fait le code tel que je l'ai mis plus haut est la version rapide.

    Si je convertis Delta en sparse avec par exemple Delta=sparse(LA==LB)
    le temps d'exécution double.

    Etrange n'est-ce pas ?

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Bon apparemment pour que cela fonctionne, je dois d'abord définir Delta en tant que sparse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Delta=sparse(zeros(N,N));
    Delta=(LA==LB);
    Peut-être est-ce dû au fait que ce soit une matrice 'logique' ?

    Ceci dit, le résultat global est encore plus rapide quand je ne définis aucune matrice en tant que sparse...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Une amélioration avec BSXFUN:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LA=repmat(LabA,1,size(LabB,1)); %LabA :labels des noeuds du grapheA
    LB=repmat(LabB',size(LabA,1),1);
    Delta=(LA==LB); % comparaison binaire des labels
    Remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Delta = bsxfun(@eq,LabA,LabB.');
    As-tu pensé à pré-allouer S?

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Je n'avais pas pensé à BSXFUN, merci ça accélère un peu le bidule

    Sinon oui j'ai pré-alloué S, ce qui m'a fait gagner pas mal de temps de calcul.

  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 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 : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par Mathieu999 Voir le message
    Bon apparemment pour que cela fonctionne, je dois d'abord définir Delta en tant que sparse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Delta=sparse(zeros(N,N));
    Delta=(LA==LB);
    Sauf que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >> Delta=sparse(zeros(N,N));
    >> issparse(Delta)
     
    ans =
     
         1
     
    >> Delta=(LA==LB);
    >> issparse(Delta)
     
    ans =
     
         0
    Pour conserver Delta comme matrice creuse, il faudrait faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    >> [i,j] = find(LA==LB);
    >> Delta = sparse(i,j,true,N,N);
    >> issparse(Delta)
     
    ans =
     
         1
     
    >> whos Delta
      Name         Size              Bytes  Class      Attributes
     
      Delta      300x300            262929  logical    sparse
    ou plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> Delta=sparse(LA==LB);
    >> issparse(Delta)
     
    ans =
     
         1
     
    >> whos Delta
      Name         Size              Bytes  Class      Attributes
     
      Delta      300x300            262929  logical    sparse
    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)

Discussions similaires

  1. projet multiple matrice
    Par zoub0 dans le forum C++
    Réponses: 1
    Dernier message: 18/04/2012, 14h16
  2. Compréhension matrice sparse
    Par Frobenius dans le forum ALM
    Réponses: 0
    Dernier message: 10/04/2012, 22h44
  3. Filtrage Kalman, multiplication matrice
    Par kronanberg dans le forum Signal
    Réponses: 1
    Dernier message: 13/05/2011, 16h14
  4. Matrices sparse avec Boost
    Par circe dans le forum Boost
    Réponses: 1
    Dernier message: 12/12/2009, 12h14
  5. Matrices sparse et fonction spconvert
    Par alain10025 dans le forum MATLAB
    Réponses: 8
    Dernier message: 16/11/2007, 23h19

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