我是初學者,有LAPACK和C++/Fortran接口。我需要在Mac OS-X Lion上使用LAPACK/BLAS解決線性方程和特徵值問題。 OS-X Lion提供優化的BLAS和LAPACK庫(在/ usr/lib中),我將這些庫鏈接起來,而不是從netlib下載它們。用一個簡單的例子來理解C++中的LAPACK調用
我的程序(轉載如下)編譯和運行良好,但它給了我錯誤的答案。我已經在Web和Stackoverflow中進行了研究,並且可能需要處理C++和Fortran如何以不同格式存儲數組(行大大於列大小)的問題。但是,正如您在我的示例中所看到的,我的示例的簡單數組在C++和Fortran中應該看起來完全相同。無論如何,這裏。
假設我們想要解決以下線性系統:
X + Y = 2
X - Y = 0
的解決方案是(X,Y)=(1,1 )。現在我試圖解決這個使用LAPACK如下
// LAPACK test code
#include<iostream>
#include<vector>
using namespace std;
extern "C" void dgetrs(char *TRANS, int *N, int *NRHS, double *A,
int *LDA, int *IPIV, double *B, int *LDB, int *INFO);
int main()
{
char trans = 'N';
int dim = 2;
int nrhs = 1;
int LDA = dim;
int LDB = dim;
int info;
vector<double> a, b;
a.push_back(1);
a.push_back(1);
a.push_back(1);
a.push_back(-1);
b.push_back(2);
b.push_back(0);
int ipiv[3];
dgetrs(&trans, &dim, &nrhs, & *a.begin(), &LDA, ipiv, & *b.begin(), &LDB, &info);
std::cout << "solution is:";
std::cout << "[" << b[0] << ", " << b[1] << ", " << "]" << std::endl;
std::cout << "Info = " << info << std::endl;
return(0);
}
此代碼被編譯如下:
g++ -Wall -llapack -lblas lapacktest.cpp
在運行這一點,但是,我得到的解決方案爲(-2,2)這顯然是錯誤的。我已經嘗試了所有組合的行/列重新排列我的矩陣a
。同樣觀察到a
的矩陣表示應該在行和列格式中相同。我認爲讓這個簡單的例子工作會讓我開始使用LAPACK,任何幫助將不勝感激。
你使用的是什麼lapack庫,它是64位的代碼? – Anycorn 2012-04-11 18:57:13
我使用Mac OS-X Lion上原生存在的/usr/lib/liblapack.dylib和/usr/lib/libblas.dylib。我沒有安裝任何外部LAPACK/BLAS庫。 – RDK 2012-04-11 18:59:41
在你的例子中,你正在求解一個對稱矩陣,所以無論你有主要的還是主要的,你都不會看到任何區別。 – SirGuy 2012-04-11 19:00:26