【发布时间】:2012-10-09 10:00:40
【问题描述】:
我想使用 C++ 中的 Lapack 包求解线性方程组。 我打算像this 一样使用here 中的例程来实现它,即dgesv。
这是我的代码:
unsigned short int n=profentries.size();
double **A, *b, *x;
A= new double*[n];
b=new double[n];
x=new double[2];
// Generate the matrices for my equation
for(int i = 0; i < n; ++i)
{
A[i] = new double[2];
}
for(int i=0; i<n; i++)
{
A[i][0]=5;
A[i][1]=1;
b[i]=3;
}
std::cout<< "printing matrix A:"<<std::endl;
for(int i=0; i<n; i++)
{
std::cout<< A[i][0]<<" " <<A[i][1]<<std::endl;
}
// Call the LAPACK solver
x = new double[n];//probably not necessary
dgesv(A, b, 2, x); //wrong result for x!
std::cout<< "printing vector x:"<<std::endl;
/*prints
3
3
but that's wrong, the solution is (0.6, 0)!
*/
for(int i=0; i<2; i++)
{
std::cout<< x[i]<<std::endl;
}
我有以下问题:
dgesv 怎么会计算包含元素 {3, 3} 的向量 x?解决方案应该是 {0.6, 0}(用 matlab 检查过)。
问候
编辑:dgesv 可能适用于方阵。下面我的解决方案展示了如何使用 dgels 解决超定系统。
【问题讨论】:
-
Argh,你使用的那些界面太可怕了。请帮自己一个忙,使用最新 lapack 版本附带的官方 C 绑定:netlib.org/lapack/lapacke.html
-
对应的函数似乎是 LAPACKE_dgels,但它既不修改通过引用传递的向量 x 也不返回向量 x,我看对了吗?那么,如何得到解x呢?
-
我会说 LAPACKE_dgesv 是 Fortran 例程 DGESV 的包装器,是什么让您认为它应该是 LAPACKE_dgels?根据文档,在输出时,解决方案 x 存储到 B 中。
-
@janneb 我采纳了所有建议,但我并没有真正得到的是如何获得包含“未知数”的解向量 x 。我的 A 有 19 行/2 列,b 有 19 行/1 列,所以 x 应该有 2 行/1 列。这些值似乎不在 b 中!
-
对于这些维度,您的系统是超定的,并且您不能使用 dgesv(即 dgesv 要求 A 为正方形)。如果您想要最小二乘意义上的近似解(即 IIRC,matlab '\' 运算符对非平方 A 所做的工作),请改用 dgels。
标签: c++ linear-algebra lapack equation-solving