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
#include <iostream>
#include <fstream>
using namespace std;
// dgeev_ is a symbol in the LAPACK library files
extern "C" {
extern int dgeev_(char*,char*,int*,double*,int*,double*, double*, double*, int*, double*, int*, double*, int*, int*);
}
int main(int argc, char** argv){
// check for an argument
if (argc<2){
cout << "Usage: " << argv[0] << " " << " filename" << endl;
return -1;
}
int n,m;
double *data;
// read in a text file that contains a real matrix stored in column major format
// but read it into row major format
ifstream fin(argv[1]);
if (!fin.is_open()){
cout << "Failed to open " << argv[1] << endl;
return -1;
}
fin >> n >> m; // n is the number of rows, m the number of columns
data = new double[n*m];
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
fin >> data[j*n+i];
}
}
if (fin.fail() || fin.eof()){
cout << "Error while reading " << argv[1] << endl;
return -1;
}
fin.close();
// check that matrix is square
if (n != m){
cout << "Matrix is not square" <<endl;
return -1;
}
// allocate data
char Nchar='N';
double *eigReal=new double[n];
double *eigImag=new double[n];
double *vl,*vr;
int one=1;
int lwork=6*n;
double *work=new double[lwork];
int info;
// calculate eigenvalues using the DGEEV subroutine
dgeev_(&Nchar,&Nchar,&n,data,&n,eigReal,eigImag,
vl,&one,vr,&one,
work,&lwork,&info);
// check for errors
if (info!=0){
cout << "Error: dgeev returned error code " << info << endl;
return -1;
}
// output eigenvalues to stdout
cout << "--- Eigenvalues ---" << endl;
for (int i=0;i<n;i++){
cout << "( " << eigReal[i] << " , " << eigImag[i] << " )\n";
}
cout << endl;
// deallocate
delete [] data;
delete [] eigReal;
delete [] eigImag;
delete [] work;
return 0;
}
Dies kann über die Befehlszeile erstellt werden
g++ -o test_lapack test_lapack.cpp -llapack
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 Namen matrix.txt
3x3-Matrix.
3 3
-1.0 -8.0 0.0
-1.0 1.0 -5.0
3.0 0.0 2.0
Um das Programm auszuführen, geben Sie einfach ein
./test_lapack matrix.txt
an der Kommandozeile, und die Ausgabe sollte sein
--- Eigenvalues ---
( 6.15484 , 0 )
( -2.07742 , 3.50095 )
( -2.07742 , -3.50095 )
Bemerkungen:
- Das Namensschema für LAPACK scheint Sie zu stören. Eine kurze Beschreibung finden Sie hier .
- Die Schnittstelle für das DGEEV-Unterprogramm befindet sich hier . Sie sollten in der Lage sein, die Beschreibung der Argumente dort mit dem zu vergleichen, was ich hier getan habe.
- Beachten Sie den
extern "C"
Abschnitt oben, dem ich einen Unterstrich hinzugefügt habe dgeev_
. 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.
- Einige Leute schlagen möglicherweise vor, die C-Schnittstelle für LAPACK zu verwenden . Sie mögen Recht haben, aber ich habe es immer so gemacht.