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

C++ Discussion :

Matrice � bande


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    F�vrier 2011
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2011
    Messages : 5
    Par d�faut Matrice � bande
    Bonsoir � vous
    Je cherche un programme C++ pour stocker une matrice � bande sous forme condens�e, si quelqu'un peut m'aider je lui serais tr�s reconnaissant
    Voici un Exemple :
    La matrice � bande originale
    1 2 3 0 0
    4 5 6 7 0
    0 8 9 10 11
    0 0 12 13 14
    0 0 0 15 16
    La matrice sera stock�e comme une matrice rectangulaire en omettant les �l�ments nuls(la forme condens�e):
    0 1 2 3
    4 5 6 7
    8 9 10 11
    12 13 14 0
    15 16 0 0

    merci � vous.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Quelle utilisation sera faite de cette matrice � bande ?
    Comment est stock� la matrice � bande originale?

    Sinon je vous conseille l'utilisation d'un vector de list ou d'une list de list.

  3. #3
    Futur Membre du Club
    Inscrit en
    F�vrier 2011
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2011
    Messages : 5
    Par d�faut
    Bonsoir
    La matrice � bande originale est saisie manuellement (cin) , en gros c'est pour r�soudre un syst�me d��quation lin�aire par la m�thode de Gauss.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Un vector de vector serait peut �tre le plus appropri�, tu perdras au niveau du chargement mais comme tu utilises cin, �a sera n�gligeable par contre tu gagneras �norm�ment lors des acc�s.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <vector>
    int i = 0;
    std::vector< std::vector< int > > matrice;
    //tant que tu n'a pas fini
               //lire une ligne
               matrice.push_back( std::vector<int> );
               //tant que la ligne n'est pas finie de lire
                        matrice[i].push_back( valeur_lue);
               //fin tant que
               ++i;
    //fin tant que
    Tu peux lire une ligne avec getline et la stocker dans un string.
    A partir du string tu peux cr�er un streamstring puis r�cup�rer tes valeurs avec l'op�rateur '>>'.

    Essaye d�j� de faire un petit programme et montre-nous ce que �a donne. Th�oriquement tu as toutes les informations n�cessaires^^

  5. #5
    Futur Membre du Club
    Inscrit en
    F�vrier 2011
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2011
    Messages : 5
    Par d�faut
    Merci Neckara je note �a
    Mais ce qui me pose vraiment probl�me c'est comment le faire, c'est plus le cot� algorithme.
    merci encore

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <vector>
    #include <string>
    #include <sstream>
     
    std::string ligne;
    int valeurLue;
    std::vector< std::vector< int > > matrice;
    for( .... ; getline(...., ....) ; .... )
    {
               matrice.push_back( std::vector<int> );
               std::streamstring fluxLigne(...);
               while( .... ) //indice : utiliser l'opérateur >>
                        matrice[i].push_back( valeurLue);
    }
    Apr�s je ne peux pas en faire plus sans faire le code � ta place.
    Lis le man pour les diff�rentes m�thodes/classes que tu ne connais pas.

  7. #7
    Futur Membre du Club
    Inscrit en
    F�vrier 2011
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2011
    Messages : 5
    Par d�faut
    Merci Neckara

  8. #8
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Si tu veux vraiment une forme condens�e, il faut consid�rer que les quelques premi�res et derni�res lignes ont une longueur diff�rentes, jouer sur les indices de lignes pour g�rer cela, et tout stocker � plat.

  9. #9
    Futur Membre du Club
    Inscrit en
    F�vrier 2011
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2011
    Messages : 5
    Par d�faut
    Bonsoir oodini
    Justement c'est ce jeu sur les indices qui me prend la t�te!!!

  10. #10
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par d�faut
    Bonjour,

    tu as plusieurs choix de stockage possibles pour ta matrice
    1 2 3 0 0
    4 5 6 7 0
    0 8 9 10 11
    0 0 12 13 14
    0 0 0 15 16
    1. Format de stockage par bande :
    le principe consiste � stocker chaque bande dans un vecteur en rep�rant sa position par rapport � la diagonale. Par convention, la position de la diagonale est fix�e � z�ro. La bande d'indice +1 correspond � celle plac�e juste au-dessus de la diagonale, celle d'indice +2 est celle encore au-dessus, etc. Les bandes en-dessous de la diagonale sont indic�es de la m�me mani�re mais avec des nombres n�gatifs : la bande juste en dessous de la diagonale est indic�e par -1, etc. Concr�tement, dans ton exemple tu as 4 bandes, donc 4 vecteurs � stocker, d'indices respectifs -1, 0, 1, 2 :
    -1 : [4 8 12 15]
    0 : [1 5 9 13 16]
    1 : [2 6 10 14]
    2 : [3 7 11]

    2. Format COO (Coordinate) :
    c'est le format de stockage le plus simple. Il consiste � stocker chaque valeur non nulle dans un vecteur nzval, et de les rep�r�es par leur indice de ligne et de colonne dans des tableaux respectifs rowind et colind. Ces tableaux sont de la taille du nombre de valeurs non nulles. Dans ton cas, tu as 13 valeurs non nulles avec :
    nzval = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
    rowind = [1 1 1 2 2 2 2 3 3 3 3 4 4 4 5 5]
    colind = [1 2 3 1 2 3 4 2 3 4 5 3 4 5 4 5]
    Remarque : j'indice les num�ros de lignes et colonnes en commen�ant par 1 mais en C++ tu peux plut�t indic� en partant de z�ro c'est plus pratique. Il faut juste tout d�caler de -1. Par exemple, pour rowind �a donne
    rowind = [0 0 0 1 1 1 1 2 2 2 2 3 3 3 4 4]
    Il faut bien s�r faire la m�me chose pour colind dans ce cas.

    3. Format CRS (Compressed Row Storage) :
    ce format s'inspire du format COO mais en condensant les indices de ligne. Plut�t que de stocker chaque indice de ligne, on ne stocke que le num�ro de la premi�re valeur non nulle de chaque ligne (sorte de pointeur) dans un table rowptr :
    nzval = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
    rowind = [1 4 8 12 15 17] % le 17 correspond au nombre de valeurs non nulles+1
    colind = [1 2 3 1 2 3 4 2 3 4 5 3 4 5 4 5]
    Remarque : on stocke en plus le nombre de valeurs non nulles +1, ici 17, pour savoir quand s'arr�te la derni�re ligne.
    Remarque 2 : attention, ce format est orient� par ligne, c'est-�-dire qu'il faut stocker les valeurs non nulles dans nzval en parcourant la matrice par ligne.

    4. Format CCS (Compressed Column Storage) :
    m�me principe que CRS mais par colonne.

    Il existe encore plein d'autres formats mais ceux-ci sont les plus utilis�s.

    N'h�site pas si quelque chose n'est pas clair.

    EDIT : oubli d'une ligne, corrig�.

Discussions similaires

  1. Inversion matrice bande (et non pas "r�solution")
    Par mathieu1 dans le forum Fortran
    R�ponses: 10
    Dernier message: 15/04/2010, 09h38
  2. Dessiner une bande dans une matrice
    Par S4sha dans le forum MATLAB
    R�ponses: 4
    Dernier message: 23/11/2006, 13h56
  3. Gestion de matrice
    Par bzd dans le forum C
    R�ponses: 4
    Dernier message: 12/08/2002, 18h19
  4. Filtre passe Bande
    Par Mau dans le forum Algorithmes et structures de donn�es
    R�ponses: 4
    Dernier message: 28/06/2002, 17h03
  5. Comment d�finir le type matrice ?
    Par charly dans le forum Langage
    R�ponses: 7
    Dernier message: 15/06/2002, 21h01

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