Es scheint, dass viele Projekte langsam auf die Notwendigkeit stoßen, Matrixmathematik zu betreiben, und in die Falle geraten, zuerst einige Vektorklassen zu erstellen und langsam Funktionen hinzuzufügen, bis sie beim Aufbau einer halbherzigen benutzerdefinierten linearen Algebra-Bibliothek erwischt werden, und dies hängt davon ab.
Ich möchte dies vermeiden, ohne eine Abhängigkeit von einer tangential verwandten Bibliothek (z. B. OpenCV, OpenSceneGraph) aufzubauen.
Was sind die am häufigsten verwendeten Bibliotheken für Matrixmathematik / lineare Algebra und warum sollte man sich entscheiden, eine übereinander zu verwenden? Gibt es welche, von denen aus irgendeinem Grund abgeraten wird? Ich verwende dies speziell in einem geometrischen / zeitlichen Kontext * (2,3,4 Dim) *, verwende aber möglicherweise in Zukunft höherdimensionale Daten.
Ich suche nach Unterschieden in Bezug auf: API, Geschwindigkeit, Speichernutzung, Breite / Vollständigkeit, Enge / Spezifität, Erweiterbarkeit und / oder Reife / Stabilität.
Aktualisieren
Am Ende habe ich Eigen3 verwendet, mit dem ich sehr zufrieden bin.
quelle
Antworten:
Es gibt einige Projekte, die sich dafür für das Generic Graphics Toolkit entschieden haben. Das GMTL dort ist nett - es ist ziemlich klein, sehr funktional und wurde weit genug verwendet, um sehr zuverlässig zu sein. OpenSG, VRJuggler und andere Projekte haben alle darauf umgestellt, dies anstelle ihrer eigenen handgerollten Vertor / Matrix-Mathematik zu verwenden.
Ich fand es sehr schön - es erledigt alles über Vorlagen, ist also sehr flexibel und sehr schnell.
Bearbeiten:
Nach der Diskussion der Kommentare und den Änderungen dachte ich, ich würde mehr Informationen über die Vor- und Nachteile bestimmter Implementierungen herausgeben und darüber, warum Sie in Anbetracht Ihrer Situation eine über die andere wählen könnten.
GMTL -
Vorteile: Einfache API, speziell für Grafik-Engines entwickelt. Enthält viele primitive Typen, die auf das Rendern ausgerichtet sind (z. B. Ebenen, AABB, Quatenrionen mit Mehrfachinterpolation usw.), die in keinem anderen Paket enthalten sind. Sehr geringer Speicheraufwand, recht schnell und einfach zu bedienen.
Nachteile: Die API konzentriert sich speziell auf Rendering und Grafiken. Enthält keine NxM-Matrizen (General Purpose), Matrixzerlegung und -lösung usw., da diese außerhalb des Bereichs traditioneller Grafik- / Geometrieanwendungen liegen.
Eigen -
Leistungen: Saubere API , ziemlich einfach zu bedienen. Enthält ein Geometriemodul mit Quaternionen und geometrischen Transformationen. Geringer Speicheraufwand. Vollständige, hochleistungsfähige Lösung großer NxN-Matrizen und anderer universeller mathematischer Routinen.
Nachteile: Möglicherweise etwas größer als Sie möchten (?). Weniger geometrische / renderspezifische Routinen im Vergleich zu GMTL (dh: Euler-Winkeldefinitionen usw.).
IMSL -
Vorteile: Sehr vollständige numerische Bibliothek. Sehr, sehr schnell (angeblich der schnellste Löser). Mit Abstand die größte und vollständigste mathematische API. Kommerziell unterstützt, ausgereift und stabil.
Nachteile: Kosten - nicht billig. Es gibt nur sehr wenige geometrische / renderspezifische Methoden, daher müssen Sie Ihre eigenen über die linearen Algebra-Klassen rollen.
NT2 -
Vorteile: Bietet eine Syntax, die vertrauter ist, wenn Sie an MATLAB gewöhnt sind. Bietet vollständige Zerlegung und Lösung für große Matrizen usw.
Nachteile: Mathematisch, nicht fokussiert. Wahrscheinlich nicht so performant wie Eigen.
LAPACK -
Vorteile: Sehr stabile, bewährte Algorithmen. Schon lange da. Vollständige Matrixlösung usw. Viele Optionen für obskure Mathematik.
Nachteile: In einigen Fällen nicht so leistungsfähig. Portiert von Fortran mit ungerader API zur Verwendung.
Für mich persönlich kommt es auf eine einzige Frage an: Wie wollen Sie diese nutzen? Wenn Sie sich nur auf Rendering und Grafiken konzentrieren, gefällt mir das Generic Graphics Toolkit , da es eine gute Leistung erbringt und viele nützliche Rendering-Vorgänge sofort unterstützt, ohne dass Sie Ihre eigenen implementieren müssen. Wenn Sie eine universelle Matrixlösung benötigen (dh SVD- oder LU-Zerlegung großer Matrizen), würde ich mich für Eigen entscheiden , da es dies handhabt, einige geometrische Operationen bereitstellt und bei großen Matrixlösungen sehr performant ist. Möglicherweise müssen Sie mehr eigene Grafiken / geometrische Operationen (über deren Matrizen / Vektoren) schreiben, aber das ist nicht schrecklich.
quelle
Ich bin also eine ziemlich kritische Person, und wenn ich in eine Bibliothek investieren will, sollte ich besser wissen, worauf ich mich einlasse. Ich denke, es ist besser, die Kritik ernst zu nehmen und die Schmeichelei bei der Prüfung zu beleuchten. Was daran falsch ist, hat viel mehr Auswirkungen auf die Zukunft als was richtig ist. Also werde ich hier ein wenig über Bord gehen, um die Antwort zu geben, die mir geholfen hätte, und ich hoffe, dass ich anderen helfen kann, die diesen Weg gehen könnten. Denken Sie daran, dass dies auf den wenigen Überprüfungen / Tests basiert, die ich mit diesen Bibliotheken durchgeführt habe. Oh, und ich habe Reed einen Teil der positiven Beschreibung gestohlen.
Ich werde oben erwähnen, dass ich mich trotz seiner Eigenheiten für GMTL entschieden habe, weil die Eigen2-Unsicherheit nicht zu groß war. Aber ich habe kürzlich erfahren, dass die nächste Version von Eigen2 Definitionen enthält, die den Ausrichtungscode ausschalten und sicher machen. Also darf ich umschalten.Update : Ich habe auf Eigen3 umgestellt. Trotz seiner Eigenheiten sind Umfang und Eleganz zu schwer zu ignorieren, und die Optimierungen, die es unsicher machen, können mit einer Definition deaktiviert werden.
Eigen2 / Eigen3
Vorteile:
LGPLMPL2, saubere, gut gestaltete API, ziemlich einfach zu bedienen. Scheint mit einer lebendigen Community gut gepflegt zu sein. Geringer Speicheraufwand. Hochleistung. Gemacht für die allgemeine lineare Algebra, aber auch für gute geometrische Funktionen. Alle Header lib, keine Verknüpfung erforderlich.Idiocyncracies / Nachteile: (Einige / alle können durch einige Definitionen vermieden werden, die im
aktuellen EntwicklungszweigEigen3 verfügbar sind.)GMTL
Vorteile: LGPL, Fairly Simple API, speziell für Grafik-Engines entwickelt. Enthält viele primitive Typen, die auf das Rendern ausgerichtet sind (z. B. Ebenen, AABB, Quatenrionen mit Mehrfachinterpolation usw.), die in keinem anderen Paket enthalten sind. Sehr geringer Speicheraufwand, recht schnell und einfach zu bedienen. Alle Header basieren, keine Verknüpfung erforderlich.
Idiocyncracies / Nachteile:
vec1 - vec2
Gibt keinen normalen Vektor zurück undlength( vecA - vecB )
schlägt daher fehl, obwohl diesvecC = vecA - vecB
funktioniert. Sie müssen wie folgt einwickeln:length( Vec( vecA - vecB ) )
length( makeCross( vecA, vecB ) )
oder
gmtl::length( gmtl::makeCross( vecA, vecB ) )
wo Sie es sonst versuchen könnten
vecA.cross( vecB ).length()
NT2
Kann nicht sagen, weil sie mehr am fraktalen Bildheader ihrer Webseite als am Inhalt interessiert zu sein scheinen. Sieht eher nach einem akademischen Projekt als nach einem ernsthaften Softwareprojekt aus.
Letzte Veröffentlichung vor über 2 Jahren.
Anscheinend keine Dokumentation auf Englisch, obwohl angeblich irgendwo etwas auf Französisch ist.
Ich kann keine Spur einer Community rund um das Projekt finden.
LAPACK & BLAS
Vorteile: Alt und ausgereift.
Nachteile:
quelle
Für das, was es wert ist, habe ich sowohl Eigen als auch Armadillo ausprobiert. Nachfolgend finden Sie eine kurze Bewertung.
Eigene Vorteile: 1. Vollständig in sich geschlossen - keine Abhängigkeit von externem BLAS oder LAPACK. 2. Dokumentation anständig. 3. Angeblich schnell, obwohl ich es nicht auf die Probe gestellt habe.
Nachteil: Der QR-Algorithmus gibt nur eine einzige Matrix zurück, wobei die R-Matrix in das obere Dreieck eingebettet ist. Keine Ahnung, woher der Rest der Matrix kommt, und auf keine Q-Matrix kann zugegriffen werden.
Gürteltier Vorteile: 1. Große Auswahl an Zerlegungen und anderen Funktionen (einschließlich QR). 2. Ziemlich schnell (verwendet Ausdrucksvorlagen), aber ich habe es nicht wirklich auf hohe Dimensionen gebracht.
Nachteile: 1. Abhängig von externem BLAS und / oder LAPACK für Matrixzerlegungen. 2. Die Dokumentation fehlt IMHO (einschließlich der Besonderheiten von LAPACK, außer dem Ändern einer # define-Anweisung).
Wäre schön, wenn eine Open-Source-Bibliothek verfügbar wäre, die in sich geschlossen und einfach zu bedienen ist. Ich bin seit 10 Jahren auf dasselbe Problem gestoßen, und es wird frustrierend. Irgendwann habe ich GSL für C verwendet und C ++ - Wrapper darum geschrieben, aber mit modernem C ++ - insbesondere unter Verwendung der Vorteile von Ausdrucksvorlagen - sollten wir uns im 21. Jahrhundert nicht mit C herumschlagen müssen. Nur mein Tuppencehapenny.
quelle
Wenn Sie nach Hochleistungsmatrix / linearer Algebra / Optimierung auf Intel-Prozessoren suchen, würde ich mir Intels MKL-Bibliothek ansehen.
MKL wurde sorgfältig für eine schnelle Laufzeitleistung optimiert - ein Großteil davon basiert auf den sehr ausgereiften BLAS / LAPACK-Fortran-Standards. Die Leistung skaliert mit der Anzahl der verfügbaren Kerne. Freisprechbare Skalierbarkeit mit verfügbaren Kernen ist die Zukunft des Rechnens und ich würde keine Mathematikbibliothek für ein neues Projekt verwenden, das keine Multi-Core-Prozessoren unterstützt.
Ganz kurz beinhaltet es:
Ein Nachteil ist, dass die MKL-API abhängig von den von Ihnen benötigten Routinen sehr komplex sein kann. Sie können sich auch die IPP-Bibliothek (Integrated Performance Primitives) ansehen, die auf leistungsstarke Bildverarbeitungsvorgänge ausgerichtet ist, aber dennoch recht umfangreich ist.
Paul
CenterSpace-Software, .NET-Mathematikbibliotheken, centerpace.net
quelle
Ich habe gute Dinge über Eigen und NT2 gehört , aber auch nicht persönlich verwendet. Es gibt auch Boost.UBLAS , von dem ich glaube, dass es ein bisschen lang wird. Die Entwickler von NT2 erstellen die nächste Version mit der Absicht, sie in Boost zu integrieren, damit dies für etwas zählt.
Mein Lin. alg. Die Anforderungen gehen nicht über den 4x4-Matrix-Fall hinaus, daher kann ich keine Kommentare zu erweiterten Funktionen abgeben. Ich weise nur auf einige Optionen hin.
quelle
Ich bin neu in diesem Thema, daher kann ich nicht viel sagen, aber BLAS ist so ziemlich der Standard im wissenschaftlichen Rechnen. BLAS ist eigentlich ein API-Standard, der viele Implementierungen hat. Ich bin mir ehrlich gesagt nicht sicher, welche Implementierungen am beliebtesten sind oder warum.
Wenn Sie auch allgemeine lineare Algebraoperationen (Lösen von Systemen, Regression der kleinsten Quadrate, Zerlegung usw.) ausführen möchten, schauen Sie in LAPACK .
quelle
Was ist mit GLM ?
Es basiert auf der OpenGL Shading Language (GLSL) -Spezifikation und wird unter der MIT-Lizenz veröffentlicht. Deutlich auf Grafikprogrammierer ausgerichtet
quelle
Ich werde Eigen hinzufügen: Ich habe viel Code (3D-Geometrie, lineare Algebra und Differentialgleichungen) aus verschiedenen Bibliotheken in diese Bibliothek portiert - was in fast allen Fällen sowohl die Leistung als auch die Lesbarkeit des Codes verbessert.
Ein Vorteil, der nicht erwähnt wurde: Es ist sehr einfach, SSE mit Eigen zu verwenden, was die Leistung von 2D-3D-Operationen erheblich verbessert (wobei alles auf 128 Bit aufgefüllt werden kann).
quelle
Okay, ich glaube ich weiß was du suchst. Es scheint, dass GGT eine ziemlich gute Lösung ist, wie Reed Copsey vorgeschlagen hat.
Persönlich haben wir unsere eigene kleine Bibliothek gerollt, weil wir uns viel mit rationalen Punkten beschäftigen - viele rationale NURBS und Beziers.
Es stellt sich heraus, dass die meisten 3D-Grafikbibliotheken Berechnungen mit projektiven Punkten durchführen, die keine Grundlage für projektive Mathematik haben, da Sie damit die gewünschte Antwort erhalten. Am Ende haben wir Grassmann-Punkte verwendet, die eine solide theoretische Grundlage haben und die Anzahl der Punkttypen verringert haben. Grassmann-Punkte sind im Grunde die gleichen Berechnungen, die derzeit verwendet werden, mit dem Vorteil einer robusten Theorie. Am wichtigsten ist, dass es die Dinge in unseren Köpfen klarer macht, sodass wir weniger Fehler haben. Ron Goldman schrieb einen Artikel über Grassmann-Punkte in der Computergrafik mit dem Titel "Über die algebraischen und geometrischen Grundlagen der Computergrafik" .
Nicht direkt mit Ihrer Frage verbunden, aber eine interessante Lektüre.
quelle
FLENS
http://flens.sf.net
Es implementiert auch viele LAPACK-Funktionen.
quelle
Ich fand diese Bibliothek recht einfach und funktional ( http://kirillsprograms.com/top_Vectors.php ). Dies sind Bare-Bone-Vektoren, die über C ++ - Vorlagen implementiert werden. Keine ausgefallenen Dinge - genau das, was Sie mit Vektoren tun müssen (Addieren, Subtrahieren, Multiplizieren, Punktieren usw.).
quelle