Je vais être en désaccord avec certaines des autres réponses et dire que je pense que trouver comment utiliser LAPACK est important dans le domaine de l'informatique scientifique.
Cependant, il existe une grande courbe d'apprentissage pour utiliser LAPACK. En effet, il est écrit à un niveau très bas. L'inconvénient de cela est qu'il semble très cryptique et peu agréable aux sens. L'avantage est que l'interface est sans ambiguïté et ne change fondamentalement jamais. De plus, les implémentations de LAPACK, telles que la bibliothèque Intel Math Kernel, sont très rapides.
Pour mes propres besoins, j'ai mes propres classes C ++ de niveau supérieur qui s'enroulent autour des sous-programmes LAPACK. De nombreuses bibliothèques scientifiques utilisent également LAPACK en dessous. Parfois, il est plus facile de simplement les utiliser, mais à mon avis, il est très utile de comprendre l'outil en dessous. À cette fin, j'ai fourni un petit exemple de travail écrit en C ++ à l'aide de LAPACK pour vous aider à démarrer. Cela fonctionne dans Ubuntu, avec le liblapack3
package installé et d'autres packages nécessaires pour la construction. Il peut probablement être utilisé dans la plupart des distributions Linux, mais l'installation de LAPACK et sa liaison peuvent varier.
Voici le dossier 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;
}
Cela peut être construit en utilisant la ligne de commande
g++ -o test_lapack test_lapack.cpp -llapack
Cela produira un exécutable nommé test_lapack
. J'ai configuré cela pour lire dans un fichier d'entrée de texte. Voici un fichier nommé matrix.txt
contenant une matrice 3x3.
3 3
-1.0 -8.0 0.0
-1.0 1.0 -5.0
3.0 0.0 2.0
Pour exécuter le programme, tapez simplement
./test_lapack matrix.txt
sur la ligne de commande, et la sortie doit être
--- Eigenvalues ---
( 6.15484 , 0 )
( -2.07742 , 3.50095 )
( -2.07742 , -3.50095 )
Commentaires:
- Vous semblez découragé par le schéma de dénomination de LAPACK. Une brève description est ici .
- L'interface du sous-programme DGEEV est ici . Vous devriez pouvoir comparer la description des arguments à ce que j'ai fait ici.
- Notez la
extern "C"
section en haut et à laquelle j'ai ajouté un trait de soulignement dgeev_
. C'est parce que la bibliothèque a été écrite et construite en Fortran, donc c'est nécessaire pour faire correspondre les symboles lors de la liaison. Cela dépend du compilateur et du système, donc si vous l'utilisez sous Windows, tout devra changer.
- Certaines personnes pourraient suggérer d'utiliser l' interface C pour LAPACK . Ils ont peut-être raison, mais je l'ai toujours fait de cette façon.