Tôi sẽ không đồng ý với một số câu trả lời khác và nói rằng tôi tin rằng việc tìm ra cách sử dụng LAPACK rất quan trọng trong lĩnh vực điện toán khoa học.
Tuy nhiên, có một đường cong học tập lớn để sử dụng LAPACK. Điều này là do nó được viết ở mức rất thấp. Nhược điểm của nó là có vẻ rất khó hiểu, và không dễ chịu với các giác quan. Ưu điểm của nó là giao diện không rõ ràng và về cơ bản không bao giờ thay đổi. Ngoài ra, việc triển khai LAPACK, chẳng hạn như Thư viện Hạt nhân Toán học Intel thực sự nhanh chóng.
Với mục đích riêng của mình, tôi có các lớp C ++ cấp cao hơn của riêng mình, bao quanh các chương trình con LAPACK. Nhiều thư viện khoa học cũng sử dụng LAPACK bên dưới. Đôi khi việc sử dụng chúng dễ dàng hơn, nhưng theo tôi có rất nhiều giá trị trong việc tìm hiểu công cụ bên dưới. Cuối cùng, tôi đã cung cấp một ví dụ hoạt động nhỏ được viết bằng C ++ bằng LAPACK để giúp bạn bắt đầu. Điều này hoạt động trong Ubuntu, với liblapack3
gói được cài đặt và các gói cần thiết khác để xây dựng. Nó có thể được sử dụng trong hầu hết các bản phân phối Linux, nhưng cài đặt LAPACK và liên kết với nó có thể khác nhau.
Đây là tập tin 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;
}
Điều này có thể được xây dựng bằng cách sử dụng dòng lệnh
g++ -o test_lapack test_lapack.cpp -llapack
Điều này sẽ tạo ra một thực thi có tên test_lapack
. Tôi đã thiết lập điều này để đọc trong tệp nhập văn bản. Đây là một tệp có tên matrix.txt
chứa ma trận 3x3.
3 3
-1.0 -8.0 0.0
-1.0 1.0 -5.0
3.0 0.0 2.0
Để chạy chương trình, chỉ cần gõ
./test_lapack matrix.txt
tại dòng lệnh, và đầu ra phải là
--- Eigenvalues ---
( 6.15484 , 0 )
( -2.07742 , 3.50095 )
( -2.07742 , -3.50095 )
Bình luận:
- Bạn dường như bị loại bỏ bởi sơ đồ đặt tên cho LAPACK. Một mô tả ngắn ở đây .
- Giao diện cho chương trình con DGEEV có ở đây . Bạn sẽ có thể so sánh mô tả của các đối số ở đó với những gì tôi đã làm ở đây.
- Lưu ý
extern "C"
phần ở trên cùng và tôi đã thêm dấu gạch dưới vào dgeev_
. Đó là bởi vì thư viện được viết và xây dựng ở Fortran, vì vậy điều này là cần thiết để làm cho các biểu tượng khớp với nhau khi liên kết. Đây là trình biên dịch và hệ thống phụ thuộc, vì vậy nếu bạn sử dụng điều này trên Windows, tất cả sẽ phải thay đổi.
- Một số người có thể đề xuất sử dụng giao diện C để LAPACK . Họ có thể đúng, nhưng tôi luôn làm theo cách này.