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

Langage C++ Discussion :

[Langage] Classe Matrice et opérations


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 45
    Points : 32
    Points
    32
    Par défaut [Langage] Classe Matrice et opérations
    Bonjour,

    J'ai l'intention de me créer un type de données, soit les matrices creuses.
    Je ne veux que stocker les éléments différents de zéro.

    Dans le choix de la représentation, il faut tenir compte que je vise ensuite la possibilité de faire les opérations de base sur différentes matrices.
    Exemple, l'addition de m1 + m2, la soustraction, la multiplication par un scalaire et la multiplication.

    Bref, je suis encore à l'étape d'analyser mon problème, mais comme je ne suis encore à l'aise avec les conteneurs en C++, je voulais consulter avant de me lancer.

    Donc, ce que je pensais prendre comme conteneur est un map.

    Cependant, pour avoir accès aux coordonnées de rangées (i) et de colonnes (j), je voudrais rendre cela explicite. Ex : maMatrice(i,j) = 2;

    Mais il ne suffira que de surchargé les opérateurs () dans ma classe Matrice.

    Cependant, c'est de l'utilisation avec les maps que je ne suis pas certain.

    1) Comment bien utiliser le map<int,mat<int,double>> ?
    2) Est-ce mieux map<std::pair<int,int>,double> ?

    Qu'en pensez-vous ?

    Merci, bonne journée.

  2. #2
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Bonjour,

    Un tableau associatif, pourquoi faire ? Si tu n'accèdes à tes valeurs que via des indexs, ce n'est qu'un bête tableau bidimensionnel.

    Puisqu'on est en C++, autant utiliser une abstraction plus agréable qu'un double[][] : http://www.boost.org/doc/libs/1_36_0...doc/index.html

    Enfin, sache qu'il existe déjà des implémentations de matrices : http://www.boost.org/doc/libs/1_36_0.../doc/index.htm
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Je pense que tu devrais jeter à coup d'oeil à comment Blitz++ a implémenté cela.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    Un tableau associatif, pourquoi faire ? Si tu n'accèdes à tes valeurs que
    via des indexs, ce n'est qu'un bête tableau bidimensionnel.
    Parce que sa matrice est creuse.

    Enfin, sache qu'il existe déjà des implémentations de matrices :
    http://www.boost.org/doc/libs/1_36_0.../doc/index.htm
    Qui, si j'ai bonne mémoire, permet une représentation de matrice basée sur
    map.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    Oui, c'est pour cela que je ne peux utiliser tableaux associatifs.
    Et idéalement, en gardant deux clés ordonnés, il sera facile et rapide d'accèder à la valeur.

    Ex: matrice1(1,2) = 19.3, ce sera très rapide, car je serai capable d'aller voir dans un map<1,<2,...>>, ou quelque chose du genre.

    Merci des références, bien apprécié.

  6. #6
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Eh bien au temps pour moi ! Je dois bien reconnaître que je ne sais pas ce qu'est une matrice creuse.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    Ce que j'affirme est ce quoi je crois, mais je peux me tromper.

    Il s'agit d'une matrice dont on ne store que les éléments différents de 0.
    Une Sparse Matrix en anglais, je crois.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Si j'étais dans ton cas, personnellement j'opterais plutôt pour une clé constituée de la pair(i,j). Elle est unique et traduit ce qu'elle représente. J'ai du mal à voir où serait le gain d'une double map.

  9. #9
    Membre confirmé

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Points : 527
    Points
    527
    Par défaut
    Blitz++ est excellent mais n'est pas adapté aux matrices creuses.
    Boost.multi_array est peu performant, et mal implémenté dès qu'on ne suit pas leur œillères en ce qui concerne les "vues" de sous-matrices (nécessité d'utiliser using boost::detail::multi_array, modèle à base de vector et d'indices {intervalles,pas}). En revanche, boost::numeric::ublas::mapped_matrix<T> semble représenter exactement ce que vous souhaitez.

    Du coté des performances, les très nombreuses librairies C++ de traitement de matrices creuses (MTL, GMM++, SparseLib++/TNT, Seldon, Boost.uBlas, SCTL/ACTL, ...) prétendent toutes garder des performances raisonnables tout en faisant abstraction des détails d'implémentation de stockage. Je n'ai pas eu l'occasion de les tester personnellement à l'exception de Boost.uBlas, mais ce que je sais est que nous avons du faire une librairie maison après des comparatifs exhaustifs faits par un ingénieur, car nos matrices creuses ont des spécificités sur la diagonale et sont quasiment demi-vides (triangle supérieur seul avec faible densité loin de la diagonale).
    Dans le cas général, nous utilisons Boost.uBlas, plus pour des raisons de facilité de maintenance de code que pour des raisons objectives de facilité d'utilisation ou de performance.
    "Maybe C++0x will inspire people to write tutorials emphasizing simple use, rather than just papers showing off cleverness." - Bjarne Stroustrup
    "Modern C++11 is not your daddy’s C++" - Herb Sutter

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je pense que pour l'implémentation d'une classe de matrice tout dépend *vraiment* de l'utilisation finale qu'on en aura...

    Travailler sur de "grosses" matrices (~1000x1000) ? sur des matrices moyennes ? (~ 100x100) sur des toutes petites matrices comme en 3D (4x4 maxi)... Seront elles creuses (math-app), doivent elles être très optimisées (jeu 3D), ont elles une représentation physique, ....

    Prenons par exemple, l'opération d'extraction d'une sous-matrice (fenêtre, triangularisation, inversion, déterminants, ...).
    Etre capable de faire référence à une telle sous-matrice n'est pas simple (et encore moins rapide) avec des solutions à base de listes, ou map (quoique... map puisse être un poil plus adapté).
    Mais encore faut-il que ces opérations soient celles recherchées.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    Bon, merci tout le monde pour vos discussions.

    Finalement, je vais implanter une classe element qui va contenir un unsigned int i, et un unsigned int j.

    Bref, la représentation de la matrice sera une map<element,TYPE>.

    Merci, bonne journeé.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/05/2007, 20h46
  2. Réponses: 15
    Dernier message: 21/01/2007, 23h47
  3. [langage] "classe" et tableau
    Par titouille dans le forum Langage
    Réponses: 2
    Dernier message: 26/10/2006, 12h55
  4. [Langage][Classe][Methode]Comment récuperer les arguments d'une fonction ?
    Par FremyCompany dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/07/2006, 17h06
  5. aide classe matrice
    Par ba10 dans le forum C++
    Réponses: 8
    Dernier message: 17/05/2006, 09h10

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