2010-02-08 7 views
8

Ich suche eine gute (im besten Fall aktiv gepflegte) C++ Matrix Bibliothek. Dabei sollte es templated sein, weil ich einen Rationalkomplex als numerischen Typ verwenden möchte. Die Matrizen, mit denen ich mich beschäftige, sind hauptsächlich spärlich und einheitlich.Beste C++ Matrix Bibliothek für spärliche unitäre Matrizen

Können Sie bitte Bibliotheken vorschlagen und auch eine kleine Erklärung geben warum sie zu verwenden, weil ich weiß, wie man sie findet, aber ich kann nicht wirklich entscheiden, was für mich geeignet ist, weil ich die Erfahrung mit ihnen vermisse.

EDIT:

Die wichtigsten Operationen, mit denen ich zu tun sind Matrixmultiplikation, skalare Multiplikation mit einem Vektor und Kronecker-Produkt. Die Größe der Matrizen ist exponentiell und ich möchte zumindest mit Matrizen bis zu 1024x1024 Einträgen umgehen können.

+0

Wofür benötigen Sie die Matrixbibliothek? Grundlegende lineare Algebra, Löser oder ...? Wie groß sind deine Matrizen? – stephan

+0

Meistens mache ich Matrixmultiplikation, Skalarmultiplikation und verwende das Produkt von kronecker. Die Matrizen können durchaus sein, zumindest möchte ich mit 1024x1024 Matrizen umgehen können. –

Antwort

10

Viele Menschen "ernst" Matrix Sachen zu tun, die sich auf BLAS, das Hinzufügen LAPACK/ATLAS (normale Matrizen) oder UMFPACK (Sparse-Matrizen) für fortgeschrittene Mathematik. Der Grund ist, dass dieser Code gut getestet, stabil, zuverlässig und ziemlich schnell ist. Darüber hinaus können Sie sie direkt von einem Anbieter kaufen (z. B. Intel MKL), der auf Ihre Architektur abgestimmt ist, aber auch kostenlos erhalten. uBLAS erwähnt in Manuel's answer ist wahrscheinlich die Standard-C++ - BLAS-Implementierung. Und wenn Sie später etwas wie LAPACK brauchen, gibt es bindings dazu.

jedoch keine dieser Standardbibliotheken (BLAS/LAPACK/ATLAS oder uBLAS + Bindung + LAPACK/ATLAS) tickt Ihr Feld für wobei als Templat und einfach zu bedienen (es sei denn, uBLAS ist alles, was Sie jemals brauchen werden). Eigentlich muss ich zugeben, dass ich die C/Fortran-Schnittstelle direkt anrufe, wenn ich eine BLAS/LAPACK-Implementierung verwende, da ich oft nicht viel zusätzlichen Vorteil in der uBLAS + -Bindungskombination sehe.

Wenn ich eine einfach zu bedienende, universelle C++ - Matrixbibliothek benötige, neige ich dazu, Eigen zu verwenden (früher verwendete ich in der Vergangenheit NewMat). Vorteile:

  • recht schnell auf Intel-Architektur, wahrscheinlich die schnellste für kleinere Matrizen
  • schöne Oberfläche
  • fast alles, was man aus einer Matrix-Bibliothek erwartet
  • Sie können problemlos hinzufügen new types

Nachteile (IMO):

  • single-processor [Edit: teilweise behoben in Eigen 3.0]
  • langsamer für größere Matrizen und etwas fortgeschrittener Mathematik als ATLAS oder Intel MKL (z. LU Zerlegung) [Edit: auch in Eigen 3 verbessert.0]
  • nur experimentelle Unterstützung für dünn besetzte Matrizen [Edit: verbessert in der kommenden Version 3.1].

Edit: Der kommende Eigen 3.1 ermöglicht es einige Funktionen, die Intel MKL (oder jede andere BLAS/LAPACK Implementierung) zu verwenden.

+1

Ein offensichtlicher Vorteil eines C++ - Wrappers ist die von den Expression-Templates gebotene Leistungssteigerung – Manuel

+0

@Manuel: stimme zu. Temps zu vermeiden, ist das Hauptversprechen von Matrix-Template-Bibliotheken wie http://www.oonumerics.org/blitz/, http://www.osl.iu.edu/research/mtl/ usw. Aber Sie können das meiste davon tun Auch im C-Code, da BLAS-Routinen keine Matrizen kopieren, sondern wo möglich vor Ort arbeiten. – stephan

+0

Sie können einige Provisorien sparen, indem Sie alles an Ort und Stelle tun, aber es gibt andere Dinge, die Expression-Templates optimieren. Wenn Sie z. B. in einer C-Bibliothek addieren (A, addieren (B, addieren (C, D))), müssen die Zwischenergebnisse berechnet werden, und jeder Schritt beinhaltet eine Schleife, so dass Sie insgesamt drei Schleifen haben. Bei Ausdrucksvorlagen wird das Ergebnis nur einmal ausgewertet: 1 Schleife. – Manuel

4

Boost uBLAS, weil es den Boost-Filter passiert hat.

Es gibt ein paar Template-Bibliotheken, die spärliche Matrizen unterstützen, daher ist es sehr schwierig, eine bessere Begründung zu finden, wenn Sie nicht genauer auf Ihre Bedürfnisse eingehen.

1

Sie sollten auch versuchen, MLT und HASEM Matrix C++ - Bibliothek. Der letzte ist sehr gut dokumentiert.

Verwandte Themen