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 :

Matrices sparse et fonction spconvert


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Par défaut Matrices sparse et fonction spconvert
    Bonjour,

    Je travaille sur Matlab avec des matrices carrées ayant entre 32000 et 64000 lignes. J'utilise donc la fonction sparse.

    Sauriez-vous comment on peut enregistrer une matrice sparse en tableau 3 colonnes (les deux premieres etant les coordonnées dans la matrice et la troisieme colonne la valeur à cette position), je cherche en fait un "inverse" de la fonction "spconvert" ...

    Merci.

    Alain

  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 316
    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 316
    Par défaut
    Essaie 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
    15
    16
    A=sparse((rand(4)>.5).*rand(4))
     
    [r,c]=find(A);
    nz=nonzeros(A);
     
    fid=fopen('sparse.txt','wt');
     
       fprintf(fid,'%d %d %.8f\n',[r c nz].');
     
    fclose(fid);
     
    % Juste pour la vérification
    edit sparse.txt
     
    D=load('sparse.txt','-ascii');
    spconvert(D)
    Malheureusement, cette solution risque d'être assez lente sur une vraie matrice creuse

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    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 316
    Par défaut
    J'ai quelque peu simplifié le code ci-dessus (mais il risque d'être gourmand en ressource)

  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 316
    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 316
    Par défaut
    Je viens de voir la réponse de Tim Davis (Mr Sparse Matrix) sur le CSSM :

    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
    A=sparse((rand(4)>.5).*rand(4))
     
    [r,c,nz]=find(A);
     
    fid=fopen('sparse.txt','wt');
     
       fprintf(fid,'%d %d %.8f\n',[r c nz].');
     
    fclose(fid);
     
    % Juste pour la vérification
    edit sparse.txt
     
    D=load('sparse.txt','-ascii');
    spconvert(D)
    C'est encore plus propre

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Par défaut
    Merci beaucoup !

    Je rajoute une solution qui m'a été donnée par un collègue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [i j x] = find (A) ;
    D = [i j x] ;
    ou A est la matrice sparse et D le vecteur voulu.

    Alain

  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 316
    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 316
    Par défaut
    Euhh, ça doit être la fatigue, mais je ne sais plus pourquoi je me suis mis en tête d'écrire le résultat dans un fichier

  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 316
    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 316
    Par défaut
    Juste par curiosité, à quoi cela va-t-il te servir ?

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Par défaut
    Je travaille avec une matrice K 64000 par 64000 et j'utilise la commande suivante:
    K(1:32000,1:32000)=K11;

    K11 etant une matrice sparse 32000 par 32000 (un bloc donc de la matrice K)

    Le problème est que cette commande demande un temps considérable à Matlab.

    Il vaut mieux donc repasser par un tableau trois colonnes et modifier les indices du tableau correspondant à la matrice K11 et ajouter une derniere ligne:

    64000 64000 1
    K11(64000,64000)=0;

    Alors la matrice K11 devient la matrice K en très peu de temps.

    J'avoue ne pas être sûr de l'optimalité de la solution ...

  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 316
    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 316
    Par défaut
    Tu trouveras peut être quelques informations utiles sur le blog de Loren Shure : http://blogs.mathworks.com/loren/200...ces-in-matlab/

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

Discussions similaires

  1. [Débutant] return une matrice dans une fonction
    Par kheira dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/04/2010, 23h32
  2. Matrices sparse avec Boost
    Par circe dans le forum Boost
    Réponses: 1
    Dernier message: 12/12/2009, 13h14
  3. [MySQL] Est-ce possible de retourner une matrice dans une fonction PHP?
    Par zouzino dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/11/2007, 17h53
  4. matrice de char & fonction
    Par orfix dans le forum C
    Réponses: 2
    Dernier message: 25/06/2007, 12h02

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