Quelqu'un a-t-il des recommandations sur une bibliothèque matricielle C ++ rapide et utilisable?
Ce que je veux dire par utilisable est le suivant:
- Les objets matriciels ont une interface intuitive (ex.: Je peux utiliser des lignes et des colonnes lors de l'indexation)
- Je peux faire n'importe quoi avec la classe matrix que je peux faire avec LAPACK et BLAS
- Facile à apprendre et à utiliser l'API
- Installation relativement facile à installer sous Linux (j'utilise actuellement Ubuntu 11.04)
Pour moi, la facilité d'utilisation est plus importante que la vitesse ou l'utilisation de la mémoire pour éviter une optimisation prématurée. En écrivant le code, je pouvais toujours utiliser des tableaux 1-D (ou des vecteurs STL) et une arithmétique d'index ou de pointeur appropriée pour émuler une matrice, mais je préférerais ne pas le faire pour éviter les bugs. J'aimerais aussi concentrer mon effort mental sur le problème que j'essaie de résoudre et de programmer dans le domaine du problème, plutôt que d'utiliser une partie de mon attention finie pour me souvenir de toutes les petites astuces de programmation que j'avais l'habitude d'émuler comme matrices dans des matrices. , et rappelez-vous les commandes LAPACK, et cetera. De plus, moins de code je dois écrire et plus il est standardisé, mieux c'est.
Dense versus clairsemé n'a pas encore d'importance; certaines des matrices que je traite seront rares, mais pas toutes. Toutefois, si un paquet particulier gère bien les matrices denses ou creuses, il convient de le mentionner.
Les gabarits ne comptent pas beaucoup pour moi non plus, puisque je travaillerai avec des types numériques standard et que je n'aurai pas besoin de stocker autre chose que des doublons, des flottants ou des entiers. C'est sympa, mais pas nécessaire pour ce que j'aimerais faire.
la source
Réponses:
J'ai rassemblé les informations suivantes issues de recherches en ligne jusqu'à présent:
J'ai un peu utilisé Armadillo et j'ai trouvé l'interface assez intuitive. Il était donc facile de localiser les paquets binaires pour Ubuntu (et je suppose d'autres distributions Linux). Je ne l’ai pas compilé à partir de la source, mais j’espère que ce ne sera pas trop difficile. Il répond à la plupart de mes critères de conception et utilise une algèbre linéaire dense. Il peut appeler des routines LAPACK ou MKL. Il n’est généralement pas nécessaire de compiler Armadillo, il s’agit d’une bibliothèque purement basée sur des modèles: vous n’incluez que l’en-tête et le lien vers BLAS / LAPACK ou MKL, etc.
J'ai entendu de bonnes choses à propos d' Eigen , mais je ne les ai pas utilisées. Il prétend être rapide , utilise des modèles et prend en charge l'algèbre linéaire dense. LAPACK ou BLAS n’est pas une dépendance, mais semble pouvoir faire tout ce que LAPACK peut faire (plus certaines choses que LAPACK ne peut pas faire). Beaucoup de projets utilisent Eigen, ce qui est prometteur. Il contient un paquet binaire pour Ubuntu, mais en tant que bibliothèque contenant uniquement des en-têtes, il est également facile de l’utiliser ailleurs.
La version 4 de la bibliothèque de modèles de matrice semble également prometteuse et utilise des modèles. Il prend en charge l'algèbre linéaire dense et creuse , et peut appeler UMFPACK en tant que solveur crépus . Les fonctionnalités ne sont pas claires de leur site Web. Il contient un paquet binaire pour Ubuntu, téléchargeable à partir de leur site web.
PETSc , écrit par une équipe du Laboratoire National d'Argonne, a accès à des solveurs linéaires rares et denses. Je suppose donc qu'il peut fonctionner comme une bibliothèque matricielle. Il est écrit en C, mais a des liaisons C ++, je pense (et même si ce n’était pas le cas, appeler C depuis C ++ n’était pas un problème). La documentation est incroyablement complète. Le paquet est un peu excessif pour ce que je veux faire maintenant (multiplication et index matriciels pour mettre en place des programmes linéaires à nombres entiers mixtes), mais pourrait être utile comme format matriciel pour moi à l'avenir, ou pour d'autres personnes ayant des besoins différents que moi.
Trilinos , écrit par une équipe du Sandia National Laboratory, fournit des interfaces C ++ orientées objet pour les matrices denses et clairsemées via son composant Epetra et des interfaces modélisées pour les matrices denses et clairsemées via son composant Tpetra. Il comporte également des composants fournissant des fonctionnalités de résolution linéaire et de résolution propre. La documentation ne semble pas être aussi raffinée ni aussi visible que PETSc; Trilinos ressemble à l'analogue Sandia de PETSc. PETSc peut appeler certains des solveurs Trilinos. Les fichiers binaires pour Trilinos sont disponibles pour Linux.
Blitz est une bibliothèque C ++ orientée objet qui comporte des binaires Linux. Elle ne semble pas être activement maintenue (2012-06-29: une nouvelle version vient de paraître hier!), Bien que la liste de diffusion soit active, il y a donc une communauté qui l'utilise. Il ne semble pas que l'algèbre linéaire numérique soit très efficace au-delà de BLAS et ressemble à une bibliothèque matricielle dense. Il utilise des modèles.
Boost :: uBLAS est une bibliothèque orientée objet C ++ qui fait partie du projet Boost. Il prend en charge l'algèbre linéaire numérique modèle et dense. J'ai entendu dire que ce n'est pas particulièrement rapide.
Le modèle Numerical Toolkit est une bibliothèque orientée objet C ++ développée par NIST. Son auteur, Roldan Pozo, semble contribuer occasionnellement aux correctifs, mais il ne semble plus être en développement actif (la dernière mise à jour date de 2010). Il se concentre sur l'algèbre linéaire dense et fournit des interfaces pour certaines décompositions matricielles de base et un résolveur de valeurs propres.
Elemental , développé par Jack Poulson, est un progiciel d'algèbre linéaire dense à mémoire distribuée (parallèle) écrit dans un style similaire à FLAME . Pour une liste des fonctionnalités et du contexte du projet, consultez sa documentation . FLAME lui-même a une bibliothèque associée pour l'algèbre linéaire dense séquentielle et à mémoire partagée, appelée libflame , qui semble être écrite en C. orienté objet. Libflame ressemble beaucoup à LAPACK, mais avec une meilleure notation sous-jacente aux algorithmes permettant le développement de bibliothèques d'algèbre linéaire plus d'une science et moins d'un art noir.
Il existe d'autres bibliothèques qui peuvent être ajoutées à la liste. si nous comptons les paquets algébriques linéaires clairsemés comme des "bibliothèques de matrices", le meilleur que je connaisse en C est SuiteSparse , qui est programmé dans un style orienté objet. J'ai utilisé SuiteSparse et l'ai trouvé assez facile à prendre en main. cela dépend de BLAS et de LAPACK pour certains des algorithmes qui décomposent des problèmes épars en beaucoup de sous-problèmes d'algèbre linéaire petits et denses. L'auteur principal de la trousse, Tim Davis, est incroyablement serviable et polyvalent.
Les bibliothèques de sous-routines Harwell sont célèbres pour leurs routines d'algèbre linéaire éparses et sont gratuites pour les utilisateurs académiques, bien que vous deviez suivre ce processus consistant à remplir un formulaire et à recevoir un e-mail pour chaque fichier à télécharger. Comme les sous-routines ont souvent des dépendances, l’utilisation d’un résolveur peut nécessiter le téléchargement de cinq ou six fichiers, et le processus peut s'avérer fastidieux, d’autant plus que l’approbation du formulaire n’est pas instantanée.
Il existe également d'autres solutions simples à l'algèbre linéaire, mais pour autant que je sache , MUMPS et d'autres packages sont principalement dédiés à la solution de systèmes linéaires, et la résolution de systèmes linéaires est la moindre de mes préoccupations pour le moment. (Peut-être que plus tard, j'aurai besoin de cette fonctionnalité, qui pourrait être utile pour d'autres.)
la source
Ce document a été rédigé en mars 2009 pour faciliter le choix d’une bibliothèque d’algèbre linéaire pour une bibliothèque scientifique. Il évalue la portabilité, l'interface de haut niveau et les licences de plusieurs bibliothèques, parmi lesquelles Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos et uBlas. Il semble aimer particulièrement Flens et Seldon . (L'une des conditions était que les modèles C ++ et les matrices creuses devaient être pris en charge.)
la source
Parmi tous les projets énumérés ci-dessus, seuls deux poids lourds extrêmement utilisés (et pour de bonnes raisons): PETSc et Trilinos. Les deux sont développés professionnellement et ont une grande base de développeurs. Tous les autres projets sont plutôt petits comparés à ces deux projets, et je recommanderais de les accompagner car (i) ils seront pris en charge pendant longtemps et (ii) ils auront probablement déjà toutes les fonctionnalités dont vous aurez besoin concernant algèbre linéaire (et bien plus encore).
la source
Si tu veux
Ensuite, je vous recommande de regarder ma bibliothèque FLENS . Je l'ai conçu pour exactement ce genre de tâches. Cependant, il nécessite un compilateur conforme à C ++ 11 (par exemple, gcc 4.7 ou clang).
FLENS vous offre exactement les mêmes performances que l’implémentation BLAS sous-jacente. Quelques repères (plutôt anciens) montrent cela
La même chose peut être dite à propos de FLENS-LAPACK, il vous donne simplement les mêmes performances que LAPACK de Netlib si la même implémentation BLAS est utilisée.
En ce qui concerne les nouveaux points de repère, permettez-moi d'entrer plus dans les détails ...
Il y a quelque temps, j'ai demandé à Clint Whaley (l'auteur d'ATLAS) ce qu'il pensait des indices de référence publiés sur le site Eigen. Il vient de confirmer mon soupçon que ces repères ne sont probablement pas fiables. Entre-temps, d'autres repères réalisés, comme Clint l'a suggéré. Les détails peuvent être trouvés sur le site ATLAS et la liste de diffusion Eigen. Les repères ne sont pas bien présentés dans les graphiques, mais ils montrent qu'ATLAS est toujours environ 40% plus rapide que Eigen. Cela contredit les repères du site Eigen mais confirme d’autres repères (par exemple ceux de blaze-lib).
Notez que pour l'algèbre linéaire numérique dense, les produits matrice-matrice sont les plus pertinents. Personnellement, je me fiche de savoir si Eigen ou ATLAS est plus rapide. Si Eigen était plus rapide que ATLAS, j'utiliserais alors Eigen comme BLAS-backend.
Disclaimer: Oui, FLENS est mon bébé! Cela signifie que j'en ai codé environ 95% et que chaque ligne de code en valait la peine :-)
la source
J'utilise GMM ++ depuis un certain temps et j'en suis satisfait.
la source
Fondamentalement, la même question a surgi sur SO:
Quelles sont les bibliothèques d'algèbre linéaire vectorielles / matricielles C ++ les plus utilisées, ainsi que leurs compromis coûts / avantages?
(Cela ajoute de la valeur à la réponse de Geoff.)
la source
Quelle serait la meilleure bibliothèque de matrices pour traiter les matrices de petite taille, couramment utilisées, par exemple, lors de l’assemblage de matrices à éléments finis, pour effectuer des opérations de tenseur, etc.
J'utilise déjà PETSc pour la solution des grands systèmes linéaires clairsemés apparaissant dans mon application, mais j'utilise actuellement ma propre bibliothèque simple pour gérer ces matrices / vecteurs ... J'envisage de passer à une bibliothèque plus rapide. comme ceux mentionnés ci-dessus.
Quel serait le meilleur choix de coupler avec PETSc? Eigen? Tatou? BOOST :: uBlas? MTL4? J'utilise certaines choses de BOOST, alors, j'ai d'abord pensé à utiliser BOOST :: uBlas, mais il n'y a pas beaucoup de documentation, d'exemples, etc.
la source
Armadillo, Boost et d’autres font maintenant partie de Ceemple, un environnement informatique technique rapide basé sur JIT et JIT. Disponible (gratuit) sur http://www.ceemple.com .
la source
Surpris, personne n'a encore mentionné TooN . Je l'utilise avec bonheur depuis presque 3 ans maintenant.
C'est très similaire à Eigen mais pas aussi complet. Cependant, je pense qu'il a la syntaxe plus agréable à certains égards.
Il est également fourni avec des classes permettant de modéliser les transformations courantes fréquemment rencontrées dans Graphics et Vision, en fonction des groupes de Lie (spécial euclidien / orthogonal en 2 et 3 dimensions, etc.) et des algèbres de Lie associées.
la source
HASEM Matrix C ++ Library est ce dont vous avez vraiment besoin http://sourceforge.net/projects/hasem/
la source