Ich bin neu in der Computerwissenschaft und habe bereits grundlegende Methoden für Integration, Interpolation, Methoden wie RK4, Numerov usw. in C ++ gelernt. Kürzlich hat mich mein Professor gebeten, zu lernen, wie man LAPACK zur Lösung von Problemen im Zusammenhang mit Matrizen verwendet. Wie zum Beispiel das Finden von Eigenwerten einer komplexen Matrix. Ich habe noch nie Bibliotheken von Drittanbietern verwendet und schreibe fast immer meine eigenen Funktionen. Ich habe mehrere Tage lang gesucht, kann aber keinen amateurfreundlichen Leitfaden für Lapack finden. Alle von ihnen sind in Worten geschrieben, die ich nicht verstehe, und ich weiß nicht, warum die Verwendung bereits geschriebener Funktionen so kompliziert sein sollte. Sie sind voller Wörter wie zgeev, dtrsv usw. und ich bin frustriert. Ich möchte nur so etwas wie diesen Pseudocode codieren:
#include <lapack:matrix>
int main(){
LapackComplexMatrix A(n,n);
for...
for...
cin>>A(i,j);
cout<<LapackEigenValues(A);
return 0;
}
Ich weiß nicht, ob ich albern oder amateurhaft bin. Aber auch das sollte nicht so schwer sein, oder? Ich weiß nicht einmal, ob ich LAPACK oder LAPACK ++ verwenden soll. (Ich schreibe Codes in C ++ und habe keine Kenntnisse über Python oder FORTRAN) und wie man sie installiert.
Antworten:
Ich werde einigen der anderen Antworten nicht zustimmen und sagen, dass ich glaube, dass es im Bereich des wissenschaftlichen Rechnens wichtig ist , herauszufinden, wie man LAPACK verwendet .
Die Verwendung von LAPACK ist jedoch mit einer großen Lernkurve verbunden. Dies liegt daran, dass es auf einer sehr niedrigen Ebene geschrieben ist. Der Nachteil davon ist, dass es sehr kryptisch und für die Sinne nicht angenehm erscheint. Der Vorteil ist, dass die Schnittstelle eindeutig ist und sich grundsätzlich nie ändert. Darüber hinaus sind Implementierungen von LAPACK wie der Intel Math Kernel Library sehr schnell.
Für meine eigenen Zwecke habe ich meine eigenen übergeordneten C ++ - Klassen, die sich um LAPACK-Subroutinen drehen. Viele wissenschaftliche Bibliotheken verwenden auch LAPACK darunter. Manchmal ist es einfacher, sie einfach zu verwenden, aber meiner Meinung nach ist es sehr wertvoll, das darunter liegende Tool zu verstehen. Zu diesem Zweck habe ich ein kleines Arbeitsbeispiel bereitgestellt, das in C ++ mit LAPACK geschrieben wurde, um Ihnen den Einstieg zu erleichtern. Dies funktioniert in Ubuntu mit dem
liblapack3
installierten Paket und anderen zum Erstellen erforderlichen Paketen. Es kann wahrscheinlich in den meisten Linux-Distributionen verwendet werden, aber die Installation von LAPACK und die Verknüpfung damit können variieren.Hier ist die Datei
test_lapack.cpp
Dies kann über die Befehlszeile erstellt werden
Dies erzeugt eine ausführbare Datei mit dem Namen
test_lapack
. Ich habe dies so eingerichtet, dass es eine Texteingabedatei einliest. Hier ist eine Datei mit dem Namenmatrix.txt
3x3-Matrix.Um das Programm auszuführen, geben Sie einfach ein
an der Kommandozeile, und die Ausgabe sollte sein
Bemerkungen:
extern "C"
Abschnitt oben, dem ich einen Unterstrich hinzugefügt habedgeev_
. Das liegt daran, dass die Bibliothek in Fortran geschrieben und erstellt wurde. Dies ist also erforderlich, damit die Symbole beim Verknüpfen übereinstimmen. Dies ist vom Compiler und vom System abhängig. Wenn Sie dies unter Windows verwenden, muss sich alles ändern.quelle
Normalerweise weigere ich mich, den Leuten zu sagen, was sie tun sollen, anstatt ihre Frage zu beantworten, aber in diesem Fall mache ich eine Ausnahme.
Lapack ist in FORTRAN geschrieben und die API ist sehr FORTRAN-ähnlich. Es gibt eine C-API für Lapack, die die Benutzeroberfläche etwas weniger schmerzhaft macht, aber es wird niemals eine angenehme Erfahrung sein, Lapack aus C ++ zu verwenden.
Alternativ gibt es eine C ++ - Matrixklassenbibliothek namens Eigen , die viele der Funktionen von Lapack bietet, eine mit den besseren Lapack-Implementierungen vergleichbare Rechenleistung bietet und von C ++ aus sehr bequem zu verwenden ist. Hier erfahren Sie insbesondere, wie Ihr Beispielcode mit Eigen geschrieben werden kann
Dieses beispielhafte Eigenwertproblem ist ein Testfall für die Lapack-Funktion
dgeev
. Sie können den FORTRAN-Code und die Ergebnisse für dieses Problem anzeigen und Ihre eigenen Vergleiche anstellen .quelle
operator,
! Das habe ich in der Praxis noch nie gesehen :-)operator,
Überlastung interessanter / besser, als es zunächst erscheinen mag. Es wird verwendet, um Matrizen zu initialisieren. Die Einträge, die die Matrix initialisieren, können Skalarkonstanten sein, können aber auch zuvor definierte Matrizen oder Untermatrizen sein. Sehr MATLAB-artig. Ich wünschte, meine C ++ - Programmierkenntnisse wären gut genug, um etwas zu implementieren, das mich selbst hoch entwickelt hat ;-)Hier ist eine weitere Antwort in der gleichen Weise wie oben.
Sie sollten in die Armadillo C ++ - Bibliothek für lineare Algebra schauen .
Vorteile:
DGESV
Hokuspokus, nurX = solve( A, B )
(obwohl es einen Grund für diese seltsam aussehenden LAPACK-Funktionsnamen gibt ...).So würde der Code von @ BillGreene mit Armadillo aussehen:
quelle