Quelles sont les bibliothèques C++ vector/matrix math/linear algebra les plus utilisées, et leurs compromis coûts-avantages? [fermé]

Il semble que de nombreux projets aient lentement besoin de faire des mathématiques matricielles, et tombent dans le piège de construire d'abord des classes vectorielles et d'ajouter lentement des fonctionnalités jusqu'à ce qu'ils soient pris en train de construire une bibliothèque d'algèbre linéaire personnalisée, et en fonction.

Je voudrais éviter cela tout en ne construisant pas dans une dépendance à une bibliothèque liée tangentiellement (par exemple OpenCV, OpenSceneGraph).

Quelles sont les bibliothèques mathématiques/algèbre linéaire matricielles couramment utilisées, et pourquoi déciderait d'utiliser l'un sur l'autre? Il n'existe aucun qui serait déconseillé d'utiliser pour une raison quelconque? Je l'utilise spécifiquement dans un contexte géométrique / temporel*(2,3,4 Dim) * mais peut-être utiliser des données dimensionnelles plus élevées dans le futur.

Je cherche des différences par rapport à L'un des éléments suivants: API, vitesse, utilisation de la mémoire, Largeur/exhaustivité, étroitesse/spécificité, extensibilité et/ou maturité/stabilité.

Mettre à jour

J'ai fini par utiliser Eigen3 que je suis extrêmement heureux avec.

215
demandé sur halfer 2009-09-04 20:45:58

11 réponses

Il y a pas mal de projets qui se sont installés sur le Generic Graphics Toolkit pour cela. Le GMTL est agréable - il est assez petit, très fonctionnel, et a été utilisé assez largement pour être très fiable. OpenSG, VRJuggler et d'autres projets ont tous opté pour l'utiliser au lieu de leurs propres mathématiques vertor/matrix roulées à la main.

Je l'ai trouvé assez agréable-il fait tout via des modèles, donc c'est très flexible et très rapide.


Modifier:

Après la discussion des commentaires, et les modifications, j'ai pensé que je jetterais plus d'informations sur les avantages et les inconvénients des implémentations spécifiques, et pourquoi vous pourriez choisir l'un sur l'autre, compte tenu de votre situation.

GMTL -

Avantages: API Simple, spécialement conçue pour les moteurs graphiques. Inclut de nombreux types primitifs orientés vers le rendu (tels que plans, AABB, quatenrions avec interpolation multiple, etc.) qui ne sont dans aucun autre paquet. Très faible mémoire frais généraux, assez rapide, facile à utiliser.

Inconvénients: L'API est très axée spécifiquement sur le rendu et les graphiques. N'inclut pas les matrices à usage général (NxM), la décomposition et la résolution de matrices, etc., car celles-ci sont en dehors du domaine des applications graphiques/géométriques traditionnelles.

Eigen -

Avantages: Propre API, assez facile à utiliser. Comprend un module de géométrie avec quaternions et transformations géométriques. Surcharge de mémoire faible. Plein, très performant résolution de grandes matrices NxN et d'autres routines mathématiques à usage général.

Inconvénients: peut-être un peu plus grande portée que vous ne le souhaitez (?). Moins de routines spécifiques géométriques / de rendu par rapport à GMTL (c'est-à-dire: définitions d'angle D'Euler, etc.).

IMSL -

Avantages: Bibliothèque numérique très complète. Très, très rapide (soi-disant le solveur le plus rapide). De loin L'API mathématique la plus grande et la plus complète. Soutenu commercialement, mature et stable.

Inconvénients: coût-pas bon marché. Très peu de méthodes géométriques / de rendu spécifiques, vous devrez donc rouler les vôtres au-dessus de leurs classes d'algèbre linéaire.

NT2 -

Avantages: fournit une syntaxe plus familière si vous êtes habitué à MATLAB. Fournit une décomposition et une résolution complètes pour les grandes matrices, etc.

Inconvénients: mathématique, pas de rendu focalisé. Probablement pas aussi performant que Eigen.

LAPACK -

Avantages: algorithmes très stables et éprouvés. Été autour pendant un long moment. Résolution complète de la matrice, etc. Beaucoup d'options pour les mathématiques obscures.

Inconvénients: pas aussi performant dans certains cas. Porté à partir de Fortran, avec une API odd pour l'utilisation.

Personnellement, pour moi, cela se résume à une seule question-Comment envisagez-vous d'utiliser ceci. Si vous vous concentrez uniquement sur le rendu et les graphiques, j'aime Generic Graphics Toolkit , car il fonctionne bien et prend en charge de nombreuses opérations de rendu utiles hors de la boîte sans avoir à implémenter les vôtres. Si vous avez besoin d'une résolution de matrice à usage général (c'est-à-dire: SVD ou lu décomposition de grandes matrices), j'irais avec Eigen, car il gère cela, fournit des opérations géométriques et est très performant avec de grandes solutions matricielles. Vous devrez peut-être écrire plus de vos propres opérations graphiques / géométriques (au-dessus de leurs matrices / vecteurs), mais ce n'est pas horrible.

104
répondu Reed Copsey 2009-09-15 18:05:35

Donc, je suis une personne assez critique, et je me dis que si je vais investir dans une bibliothèque, je ferais mieux de savoir dans quoi je m'embarque. Je pense qu'il est préférable d'aller lourd sur la critique et la lumière sur la flatterie lors de l'examen; ce qui ne va pas avec elle a beaucoup plus d'implications pour l'avenir que ce qui est juste. Donc, je vais aller à la mer ici un peu pour fournir le genre de réponse qui m'aurait aidé et j'espère aider les autres qui peuvent cheminer dans cette voie. Gardez à l'esprit que ce est basé sur le peu de révision / test que j'ai fait avec ces bibliothèques. Oh et j'ai volé une partie de la description positive de Reed.

je mentionnerai en haut que je suis allé avec GMTL malgré ses idiosyncrasies parce que L'insafeness Eigen2 était trop gros d'un inconvénient. Mais j'ai récemment appris que la prochaine version d'Eigen2 contiendra des définitions qui éteindront le code d'alignement et le rendront sûr. Alors, j'ai peut basculer.

Mise à jour : je suis passé à Eigen3. Malgré ses particularités, sa portée et son élégance sont trop difficiles à ignorer, et les optimisations qui le rendent dangereux peuvent être désactivées avec une définition.

Eigen2 / Eigen3

Avantages: LGPL MPL2, propre, bien conçu API, assez facile à utiliser. Semble être bien entretenu avec une communauté dynamique. Surcharge de mémoire faible. La haute performance. Conçu pour l'algèbre linéaire générale, mais une bonne fonctionnalité géométrique est également disponible. Toute la lib d'en-tête, aucune liaison requise.

Idiocyncracies/inconvénients: (Certains de ces problèmes peuvent être évités par certains définit qui sont disponibles dans la branche de développement actuelle Eigen3)

  • les optimisations de performances dangereuses nécessitent un suivi attentif des règles. Le non-respect des règles provoque des accidents.
    • vous ne pouvez tout simplement pas passer en toute sécurité par la valeur
    • l'utilisation des types propres en tant que membres nécessite une personnalisation spéciale de l'allocateur (ou vous plantez)
    • utilisation avec des types de conteneurs stl et éventuellement d'autres modèles requis personnalisation d'allocation spéciale (ou vous allez planter)
    • certains compilateurs ont besoin d'un soin particulier pour éviter les plantages sur les appels de fonction (Windows GCC)

GMTL

Avantages: LGPL, API assez Simple, spécialement conçue pour les moteurs graphiques. Comprend de nombreux types primitifs orientés vers le rendu (tels que planes, AABB, quatenrions avec interpolation multiple, etc) qui ne sont pas dans les autres paquet. Surcharge de mémoire très faible, assez rapide, facile à utiliser. Tout en-tête basé, aucune liaison nécessaire.

Idiocyncracies / inconvénients:

  • L'API est excentrique
    • ce qui pourrait être myVec.x() dans une autre lib n'est disponible que via myVec [0] (problème de lisibilité)
      • un tableau ou stl::vecteur de points peut vous amener à faire quelque chose comme pointsList[0][0] pour accéder à la composante x du premier point
    • dans une tentative naïve d'optimisation, supprimé croix(vec,vec) et remplacé par makeCross(vec,vec,vec) lorsque le compilateur élimine temps inutiles de toute façon
    • les opérations mathématiques normales ne renvoient pas les types normaux sauf si vous fermez désactiver certaines fonctionnalités d'optimisation, par exemple: vec1 - vec2 ne renvoie pas vecteur normal donc length( vecA - vecB ) échoue, même si vecC = vecA - vecB œuvres. Vous devez envelopper comme: length( Vec( vecA - vecB ) )
    • les opérations sur les vecteurs sont fournies par des fonctions externes plutôt que membre. Cela peut vous obliger à utiliser la résolution de portée partout depuis commun les noms de symboles peuvent entrer en collision
    • que vous avez à faire
        length( makeCross( vecA, vecB ) )
      ou
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      où sinon, vous pouvez essayer
        vecA.cross( vecB ).length()
  • pas bien entretenues
    • toujours revendiqué comme " bêta"
    • documentation manquante informations de base comme quels en-têtes sont nécessaires pour utilisation normale functionalty
      • Vec.h NE CONTIENT PAS d'opérations pour les vecteurs, VecOps.h contient certains, d'autres sont en Générer.h par exemple. croix(vec&,vec&,vec&) dans VecOps.h, [faire]de la croix(vec&,vec&) en Générer.h
  • API immature / instable; toujours en train de changer.
    • par exemple," cross "est passé de" VecOps.h " à " générer.h", et ensuite, le nom a été changé en "makeCross". Les exemples de Documentation échouent parce que toujours se référer à d'anciennes versions de fonctions qui n'existent plus.

NT2

Ne peut pas dire parce qu'ils semblent être plus intéressés par l'en-tête de l'image fractale de leur page web que le contenu. Ressemble plus à un projet académique qu'à un projet logiciel sérieux.

Dernière version il y a plus de 2 ans.

Apparemment pas de documentation en anglais bien que soi-disant Il y ait quelque chose en français quelque part.

Je ne peux pas trouver la trace d'une communauté autour du projet.

LAPACK & BLAS

Avantages: vieux et mature.

Inconvénients:

  • vieux comme des dinosaures avec des API vraiment merdiques
31
répondu Catskul 2016-04-06 23:53:59

Si vous recherchez une matrice/algèbre linéaire/optimisation haute performance sur les processeurs Intel, je regarderais la bibliothèque MKL D'Intel.

MKL est soigneusement optimisé pour des performances d'exécution rapides-une grande partie basée sur les normes BLAS/LAPACK fortran très matures. Et ses échelles de performance avec le nombre de cœurs disponibles. L'évolutivité mains libres avec les cœurs disponibles est l'avenir de l'informatique et je n'utiliserais aucune bibliothèque mathématique car un nouveau projet ne prend pas en charge le multi-cœur processeur.

Très brièvement, il comprend:

  1. vecteur-Vecteur De Base, vecteur-matrice, et matrice-opérations matricielles
  2. factorisation matricielle (lu decomp, hermitien, sparse)
  3. problèmes d'ajustement des moindres carrés et de valeur propre
  4. solveurs de systèmes linéaires clairsemés
  5. solveur non linéaire des moindres carrés (régions de confiance)
  6. plus les routines de traitement du signal telles que la FFT et la convolution
  7. générateurs de nombres aléatoires très rapides (Mersenne twist)
  8. beaucoup plus.... voir: texte du lien

Un inconvénient est que L'API MKL peut être assez complexe en fonction des routines dont vous avez besoin. Vous pouvez également jeter un oeil à leur bibliothèque IPP (Integrated Performance Primitives) qui est orientée vers des opérations de traitement d'image haute performance, mais est néanmoins assez large.

Paul

Logiciel CenterSpace, bibliothèques mathématiques. net, centerspace.net

11
répondu Paul 2009-10-15 05:38:03

Pour ce que ça vaut, j'ai essayé Eigen et Armadillo. Ci-dessous une brève évaluation.

Eigen Avantage: 1. Complètement autonome-aucune dépendance sur Blas externe ou LAPACK. 2. Documentation décent. 3. Soi-disant rapide, bien que je ne l'ai pas mis à l'épreuve.

Inconvénient: L'algorithme QR renvoie une seule matrice, avec la matrice R intégrée dans le triangle supérieur. Aucune idée d'où vient le reste de la matrice, et aucune matrice Q Ne peut être accéder.

Tatou Avantage: 1. Large gamme de décompositions et d'autres fonctions (y compris QR). 2. Raisonnablement rapide (utilise des modèles d'expression), mais encore une fois, je ne l'ai pas vraiment poussé à des dimensions élevées.

Inconvénients: 1. Dépend de BLAS externe et / ou LAPACK pour les décompositions matricielles. 2. La Documentation manque à mon humble avis (y compris les détails wrt LAPACK, autre que la modification d'une instruction #define).

Serait bien si une bibliothèque open source ont est autonome et simple à utiliser. J'ai rencontré ce même problème pendant 10 ans, et cela devient frustrant. À un moment donné, j'ai utilisé GSL pour C et écrit des wrappers C++, mais avec le C++ moderne-en particulier en utilisant les avantages des modèles d'expression-Nous ne devrions pas avoir à jouer avec C au 21ème siècle. Juste mon tuppencehapenny.

11
répondu Francis Urquhart 2012-10-01 19:13:06

J'ai entendu de bonnes choses à propos de Propres et NT2, mais je n'ai personnellement pas utilisé. Il y a aussi Boost.UBLAS , qui je crois devient un peu long dans la dent. Les développeurs de NT2 construisent la prochaine version avec l'intention de L'obtenir dans Boost, de sorte que cela pourrait compter pour quelque chose.

Mon lin. alg. les besoins ne dépassent pas le cas de la matrice 4x4, donc je ne peux pas commenter les fonctionnalités avancées; je signale juste quelques options.

8
répondu Jeff Hardy 2009-09-04 16:53:06

Je suis nouveau sur ce sujet, donc je ne peux pas en dire beaucoup, mais BLAS est à peu près la norme en informatique scientifique. BLAS est en fait une norme API, qui a de nombreuses implémentations. Honnêtement, je ne sais pas quelles implémentations sont les plus populaires ou pourquoi.

Si vous voulez également être capable de faire des opérations d'algèbre linéaire communes (systèmes de résolution, régression des moindres carrés, décomposition, etc.) regardez dans LAPACK .

8
répondu davidtbernal 2009-09-04 16:56:36

Qu'en est-il de GLM ?

Il est basé sur la spécification OpenGL Shading Language (GLSL) et publié sous la licence MIT. Clairement destiné aux programmeurs graphiques

6
répondu user3742582 2014-10-21 14:46:25

J'ajouterai vote pour Eigen: j'ai porté beaucoup de code (géométrie 3D, algèbre linéaire et équations différentielles) de différentes bibliothèques à celui - ci-améliorant à la fois les performances et la lisibilité du code dans presque tous les cas.

Un avantage qui n'a pas été mentionné: il est très facile à utiliser SSE avec Eigen, ce qui améliore considérablement les performances des opérations 2D-3D (où tout peut être rembourré à 128 bits).

5
répondu ima 2009-09-16 13:48:38

OK, je crois que je sais ce que tu cherches. Il semble que GGT est une très bonne solution, comme l'a suggéré Reed Copsey.

Personnellement, nous avons roulé notre propre petite bibliothèque, parce que nous traitons beaucoup de points rationnels - beaucoup de NURBS rationnels et de Béziers.

Il s'avère que la plupart des bibliothèques graphiques 3D font des calculs avec des points projectifs qui n'ont aucune base en mathématiques projectives, car c'est ce qui vous donne la réponse que vous voulez. Nous avons fini par utiliser des points Grassmann, qui ont un solide fondement théorique et a diminué le nombre de types de points. Grassmann points sont fondamentalement les mêmes calculs de gens utilisent maintenant, avec l'avantage d'une théorie robuste. Plus important encore, cela rend les choses plus claires dans nos esprits, donc nous avons moins de bugs. Ron Goldman a écrit un article sur les points Grassmann en infographie appelé "sur les fondements algébriques et géométriques de L'Infographie" .

Pas directement lié à votre question, mais un intéressant lire.

4
répondu tfinniga 2009-09-04 20:56:58

FLENS

Http://flens.sf.net

Il implémente également beaucoup de fonctions LAPACK.

0
répondu Michael Lehn 2012-09-03 13:43:21

J'ai trouvé cette bibliothèque assez simple et fonctionnelle ( http://kirillsprograms.com/top_Vectors.php). ce sont des vecteurs osseux nus implémentés via des modèles C++. Pas de fantaisie - tout ce que vous devez faire avec des vecteurs (ajouter, soustraire multiplier, point, etc).

0
répondu Clark Gamble 2014-09-24 21:23:08