Ben diğer bazı yanıtlar katılmıyorum ve ben LAPACK nasıl kullanılacağını endam inanıyoruz söylemek için gidiyorum olduğunu bilimsel bilgi işlem alanında önemli.
Bununla birlikte, LAPACK'i kullanmak için büyük bir öğrenme eğrisi vardır. Çünkü çok düşük bir seviyede yazılmıştır. Bunun dezavantajı, çok şifreli ve duyular için hoş görünmemesi. Bunun avantajı, arayüzün açık olması ve temelde asla değişmemesidir. Ek olarak, Intel Math Çekirdek Kütüphanesi gibi LAPACK uygulamaları gerçekten hızlıdır.
Kendi amaçlarım için, LAPACK altyordamlarını saran kendi üst düzey C ++ sınıflarım var. Birçok bilimsel kütüphane de altında LAPACK kullanır. Bazen bunları kullanmak daha kolaydır, ancak bence altındaki aracı anlamada çok değer var. Bu amaçla, başlamak için LAPACK kullanarak C ++ ile yazılmış küçük bir çalışma örneği sağladım. Bu, Ubuntu'da, liblapack3
paket kurulu olarak ve bina için gerekli diğer paketlerle çalışır. Muhtemelen çoğu Linux dağıtımında kullanılabilir, ancak LAPACK'in kurulumu ve ona bağlanma değişebilir.
İşte dosya 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;
}
Bu komut satırı kullanılarak oluşturulabilir
g++ -o test_lapack test_lapack.cpp -llapack
Bu adlı bir yürütülebilir dosya üretir test_lapack
. Bunu bir metin giriş dosyasında okumak üzere ayarladım. İşte matrix.txt
3x3'lük bir matris içeren bir dosya .
3 3
-1.0 -8.0 0.0
-1.0 1.0 -5.0
3.0 0.0 2.0
Programı çalıştırmak için
./test_lapack matrix.txt
komut satırında ve çıktı
--- Eigenvalues ---
( 6.15484 , 0 )
( -2.07742 , 3.50095 )
( -2.07742 , -3.50095 )
Yorumlar:
- LAPACK için adlandırma şemasından atıldınız. Kısa bir açıklama burada .
- DGEEV altyordamının arayüzü burada . Oradaki argümanların açıklamasını burada yaptığımla karşılaştırabilmelisiniz.
- Not
extern "C"
Ben bir çizgi ekledim o üstündeki bölümü ve dgeev_
. Çünkü kütüphane Fortran'da yazılmış ve inşa edilmiştir, bu yüzden bağlantı yaparken sembollerin eşleşmesi gerekir. Bu derleyiciye ve sisteme bağlıdır, bu yüzden bunu Windows'ta kullanırsanız, hepsinin değişmesi gerekecektir.
- Bazı insanlar LAPACK için C arayüzünü kullanmanızı önerebilir . Haklı olabilirler, ama ben hep böyle yaptım.