我是初学者,有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