Hat jemand Empfehlungen zu einer verwendbaren, schnellen C ++ - Matrixbibliothek?
Was ich unter verwendbar verstehe, ist folgendes:
- Matrix-Objekte haben eine intuitive Benutzeroberfläche (Beispiel: Ich kann beim Indizieren Zeilen und Spalten verwenden)
- Mit der Matrix-Klasse kann ich alles machen, was ich mit LAPACK und BLAS machen kann
- Einfach zu erlernende und zu verwendende API
- Relativ schmerzlos unter Linux zu installieren (ich benutze Ubuntu 11.04 gerade)
Benutzerfreundlichkeit ist für mich im Moment wichtiger als Geschwindigkeit oder Speichernutzung, um eine vorzeitige Optimierung zu vermeiden. Beim Schreiben des Codes konnte ich immer 1-D-Arrays (oder STL-Vektoren) und eine geeignete Index- oder Zeigerarithmetik verwenden, um eine Matrix zu emulieren, aber ich würde es vorziehen, um Fehler zu vermeiden. Ich möchte meine mentalen Anstrengungen auch auf das eigentliche Problem konzentrieren, das ich zu lösen und in den Problembereich zu programmieren versuche, anstatt einen Teil meiner endlichen Aufmerksamkeit darauf zu verwenden, mich an all die kleinen Programmiertricks zu erinnern, mit denen ich Matrizen als Arrays emuliert habe und erinnern Sie sich an LAPACK-Befehle usw. Je weniger Code ich schreiben muss und je standardisierter er ist, desto besser.
Dicht gegen dünn spielt noch keine Rolle; Einige der Matrizen, mit denen ich zu tun habe, werden spärlich sein, aber nicht alle. Wenn ein bestimmtes Paket jedoch dichte oder spärliche Matrizen gut verarbeitet, ist dies erwähnenswert.
Templating ist mir auch nicht so wichtig, da ich mit numerischen Standardtypen arbeite und nichts anderes als Doubles, Floats oder Ints speichern muss. Es ist schön, aber nicht notwendig für das, was ich gerne machen würde.
quelle
Antworten:
Ich habe bisher Folgendes aus der Online-Forschung zusammengetragen:
Ich habe Armadillo ein wenig benutzt und fand die Oberfläche intuitiv genug und es war einfach, Binärpakete für Ubuntu zu finden (und ich gehe von anderen Linux-Distributionen aus). Ich habe es nicht aus dem Quellcode zusammengestellt, aber ich hoffe, dass es nicht zu schwierig wird. Es erfüllt die meisten meiner Entwurfskriterien und verwendet eine dichte lineare Algebra. Es kann LAPACK- oder MKL-Routinen aufrufen. Es ist in der Regel nicht erforderlich, Armadillo zu kompilieren. Es handelt sich um eine rein vorlagenbasierte Bibliothek. Sie müssen nur den Header und den Link zu BLAS / LAPACK oder MKL usw. einfügen.
Ich habe gute Dinge über Eigen gehört , es aber nicht benutzt. Es behauptet, schnell zu sein , verwendet Templating und unterstützt dichte lineare Algebra. Es hat weder LAPACK noch BLAS als Abhängigkeit, scheint aber in der Lage zu sein, alles zu tun, was LAPACK kann (plus einige Dinge, die LAPACK nicht kann). Viele Projekte verwenden Eigen, was vielversprechend ist. Es hat ein Binärpaket für Ubuntu, aber als reine Header-Bibliothek ist es trivial, es auch anderswo zu verwenden.
Die Matrix Template Library Version 4 sieht ebenfalls vielversprechend aus und verwendet Vorlagen . Es unterstützt lineare Algebra mit und ohne Dichte und kann UMFPACK als Solver mit geringer Dichte aufrufen . Die Funktionen sind auf ihrer Website etwas unklar. Es gibt ein Binärpaket für Ubuntu, das von der Website heruntergeladen werden kann.
PETSc , das von einem Team des Argonne National Laboratory geschrieben wurde, hat Zugriff auf spärliche und dichte lineare Löser, daher gehe ich davon aus, dass es als Matrixbibliothek fungieren kann. Es ist in C geschrieben, hat aber C ++ - Bindungen, denke ich (und selbst wenn nicht, ist das Aufrufen von C aus C ++ kein Problem). Die Dokumentation ist unglaublich gründlich. Das Paket ist ein bisschen übertrieben für das, was ich jetzt tun möchte (Matrixmultiplikation und Indexierung zum Einrichten von linearen Programmen mit gemischten Ganzzahlen), könnte aber in Zukunft als Matrixformat für mich oder für andere Personen mit anderen Bedürfnissen nützlich sein als ich.
Trilinos , geschrieben von einem Team des Sandia National Laboratory, bietet in seiner Epetra-Komponente objektorientierte C ++ - Schnittstellen für dichte und spärliche Matrizen und in seiner Tpetra-Komponente vorgefertigte Schnittstellen für dichte und spärliche Matrizen. Es enthält auch Komponenten, die lineare Lösungs- und Eigensolverfunktionen bereitstellen. Die Dokumentation scheint nicht so ausgefeilt oder auffällig zu sein wie PETSc. Trilinos scheint das Sandia-Analogon von PETSc zu sein. PETSc kann einige der Trilinos-Löser aufrufen. Binärdateien für Trilinos sind für Linux verfügbar.
Blitz ist eine objektorientierte C ++ - Bibliothek mit Linux-Binärdateien. Es scheint nicht aktiv gewartet zu werden (2012-06-29: Eine neue Version ist erst gestern erschienen!), Obwohl die Mailingliste aktiv ist, so dass es eine Community gibt, die sie verwendet. Es scheint nicht viel für die numerische lineare Algebra jenseits von BLAS zu tun und sieht aus wie eine dichte Matrixbibliothek. Es werden Vorlagen verwendet.
Boost :: uBLAS ist eine objektorientierte C ++ - Bibliothek und Teil des Boost-Projekts. Es unterstützt Templating und dichte numerische lineare Algebra. Ich habe gehört, es ist nicht besonders schnell.
Das Template Numerical Toolkit ist eine von NIST entwickelte objektorientierte C ++ - Bibliothek. Sein Autor, Roldan Pozo, scheint gelegentlich Patches beizusteuern, aber es scheint nicht mehr in aktiver Entwicklung zu sein (letztes Update war 2010). Es konzentriert sich auf die dichte lineare Algebra und bietet Schnittstellen für einige grundlegende Matrixzerlegungen und einen Eigenwertlöser.
Elemental , entwickelt von Jack Poulson, ist ein (paralleles) lineares Algebra-Softwarepaket mit verteiltem Speicher, das in einem ähnlichen Stil wie FLAME geschrieben wurde . Eine Liste der Funktionen und Hintergrundinformationen zum Projekt finden Sie in seiner Dokumentation . FLAME selbst hat eine Bibliothek für sequentielle und gemeinsam genutzte, dichte lineare Algebra namens libflame , die in objektorientiertem C geschrieben zu sein scheint. Libflame ähnelt LAPACK, hat jedoch eine bessere Notation, die den Algorithmen zugrunde liegt, um die Entwicklung schneller numerischer Werte zu ermöglichen lineare algebra bibliotheken eher eine wissenschaft und weniger eine schwarze kunst.
Es gibt andere Bibliotheken, die der Liste hinzugefügt werden können. Wenn wir spärliche lineare Algebra-Pakete als "Matrix-Bibliotheken" zählen, ist SuiteSparse , das objektorientiert programmiert ist , das beste freie, das ich in C kenne . Ich habe SuiteSparse verwendet und fand es ziemlich einfach, es zu erlernen. Es hängt von BLAS und LAPACK für einige der Algorithmen ab, die spärliche Probleme in viele kleine, dichte lineare Algebra-Teilprobleme zerlegen. Der Hauptautor des Pakets, Tim Davis, ist unglaublich hilfsbereit und ein großartiger Allrounder.
Die Harwell-Subroutinenbibliotheken sind für ihre spärlichen linearen Algebra-Routinen bekannt und für akademische Benutzer kostenlos. Sie müssen jedoch diesen Prozess durchlaufen, indem Sie ein Formular ausfüllen und für jede Datei, die Sie herunterladen möchten, eine E-Mail erhalten. Da die Unterprogramme häufig Abhängigkeiten aufweisen, muss bei Verwendung eines Solvers möglicherweise fünf oder sechs Dateien heruntergeladen werden, und der Vorgang kann etwas langwierig werden, insbesondere weil die Formulargenehmigung nicht sofort erfolgt.
Es gibt auch andere spärliche lineare Algebra-Löser, aber soweit ich das beurteilen kann, konzentrieren sich MUMPS und andere Pakete hauptsächlich auf die Lösung linearer Systeme, und das Lösen linearer Systeme ist momentan das geringste meiner Probleme. (Vielleicht benötige ich diese Funktionalität später, und sie könnte für andere nützlich sein.)
quelle
Dieses Dokument wurde im März 2009 verfasst, um bei der Auswahl einer linearen Algebra-Bibliothek für eine wissenschaftliche Bibliothek zu helfen. Es bewertet die Portabilität, das High-Level-Interface und die Lizenzierung für mehrere Bibliotheken, darunter Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos und uBlas. Es scheint besonders gern Flens und Seldon . (Eine der Anforderungen war, dass C ++ - Vorlagen und spärliche Matrizen unterstützt werden mussten.)
quelle
Von den oben aufgeführten Projekten gibt es tatsächlich nur zwei Schwergewichte, die (und das aus guten Gründen) extrem weit verbreitet sind: PETSc und Trilinos. Beide sind professionell entwickelt und verfügen über eine große Entwicklerbasis. Alle anderen Projekte sind im Vergleich zu diesen beiden eher kleine Projekte, und ich würde empfehlen, sie zu begleiten, da (i) sie noch lange unterstützt werden und (ii) sie wahrscheinlich bereits über alle Funktionen verfügen, die Sie jemals benötigen werden lineare Algebra (und noch viel mehr).
quelle
Falls Sie es wollen
Dann empfehle ich Ihnen, sich meine Bibliothek FLENS anzuschauen . Ich habe es für genau diese Art von Aufgaben entworfen. Es erfordert jedoch einen C ++ 11-konformen Compiler (z. B. gcc 4.7 oder clang).
FLENS bietet genau dieselbe Leistung wie die zugrunde liegende BLAS-Implementierung. Es gibt einige (ziemlich alte) Benchmarks, die dies zeigen
Das Gleiche gilt für FLENS-LAPACK. Mit derselben BLAS-Implementierung erhalten Sie genau dieselbe Leistung wie mit Netlibs LAPACK.
Lassen Sie mich in Bezug auf neue Benchmarks näher auf die Details eingehen ...
Vor einiger Zeit habe ich Clint Whaley (den Autor von ATLAS) gefragt, was er von den auf der Eigen-Site veröffentlichten Benchmarks hält. Er hat gerade meinen Verdacht bestätigt, dass diese Benchmarks höchstwahrscheinlich nicht zuverlässig sind. In der Zwischenzeit realisierten einige andere Benchmarks, wie Clint es vorgeschlagen hatte. Details finden Sie auf der ATLAS-Seite und in der Eigen-Mailingliste. Die Benchmarks werden in Grafiken nicht gut dargestellt, aber sie zeigen, dass ATLAS immer etwa 40% schneller ist als Eigen. Dies widerspricht den Benchmarks der Eigen-Site, bestätigt jedoch andere Benchmarks (z. B. von blaze-lib).
Beachten Sie, dass für die dichte numerische lineare Algebra die Matrix-Matrix-Produkte am relevantesten sind. Persönlich ist es mir egal, ob Eigen oder ATLAS schneller ist. Wenn Eigen schneller als ATLAS wäre, würde ich Eigen als BLAS-Backend verwenden.
Haftungsausschluss: Ja, FLENS ist mein Baby! Das heißt, ich habe ungefähr 95% davon codiert und jede Codezeile hat sich gelohnt :-)
quelle
Ich benutze GMM ++ seit einiger Zeit und bin damit zufrieden.
quelle
Grundsätzlich tauchte bei SO die gleiche Frage auf:
Was sind die am häufigsten verwendeten C ++ - Vektor- / Matrix-Mathematik- / Linear-Algebra-Bibliotheken und ihre Kosten- und Nutzen-Kompromisse?
(Es verleiht der Antwort von Geoff einen Mehrwert.)
quelle
Was wäre die beste Matrixbibliothek für den Umgang mit kleinen Matrizen, die üblicherweise zum Beispiel beim Zusammensetzen von Finite-Elemente-Matrizen, zum Ausführen von Tensoroperationen usw. verwendet werden?
Ich benutze PETSc bereits für die Lösung der in meiner Anwendung auftretenden großen, dünn besetzten linearen Systeme, verwende aber derzeit meine eigene einfache Bibliothek, um mit diesen Matrizen / Vektoren umzugehen ... Ich überlege, auf eine schnellere Bibliothek umzusteigen wie die oben genannten.
Was wäre die beste Wahl, um mit PETSc zu koppeln? Eigen? Gürteltier? BOOST :: uBlas? MTL4? Ich verwende einige Dinge von BOOST, also habe ich zuerst über die Verwendung von BOOST :: uBlas nachgedacht, aber es gibt nicht viel Dokumentation, Beispiele usw.
quelle
Armadillo, Boost und andere sind jetzt Teil von Ceemple, einer schnellen JIT-basierten technischen C ++ - Computerumgebung. Erhältlich (kostenlos) unter http://www.ceemple.com .
quelle
Überrascht hat noch niemand TooN erwähnt . Ich benutze es seit fast 3 Jahren.
Es ist Eigen sehr ähnlich, wenn auch nicht so umfassend. Allerdings denke ich, dass es in gewisser Weise die schönere Syntax hat.
Es enthält auch Klassen, mit denen gängige Transformationen modelliert werden können, die in Graphics and Vision häufig vorkommen, basierend auf Lie-Gruppen (Special Euclidean / Orthogonal in 2 und 3 Dimensionen usw.) und den zugehörigen Lie-Algebren.
quelle
Die HASEM Matrix C ++ Library ist genau das, was Sie wirklich brauchen. Http://sourceforge.net/projects/hasem/
quelle