dgeqrf(LAPACK) 在 C++ 中无法正常工作

dgeqrf(LAPACK) not working properly in c++

如果您能帮助我解决以下问题,我将不胜感激。我偶然发现了这堵墙,我真的不知道这里有什么问题。我想用c++下的LAPACK函数dgeqrf、dormqr和dtrtrs来求解齐次系统(15乘15)。但我试图看看我是否可以直接解决更简单的系统。我在这里发布的是我对 dgeqrf 的简单用法。

#include "lapacke.h"
#include "lapacke_config.h"
#include "lapacke_mangling.h"
#include "lapacke_utils.h"
using namespace std;

int main()
{

int     INFO=3;
double WORK[3];
int LWORK=3;
double TAU[3];
int     LDA = 3;
int     LDB = 3;
int     N = 3;


double det;

double  A[9] =
{
    1, 1, 0,
    0, 1, 0,
    0, 1, 1
};

// end of declarations
LAPACK_dgeqrf(&N,&N,A,&LDA,TAU,WORK,&LWORK,&INFO);
for(int i=0;i<N*N;i++){
cout<<A[i]<<",";
}
cout<<endl;
if (INFO!=0){
return 0;
}
det=pow(-1,N-1);
 for(int i=0;i<N;i++){
det = det * A[i*N+i];
}
cout<<det<<endl;

我不明白的是为什么我得到的 R 矩阵不正确? 打印输出给出:

 -1.41421,0.414214,0,-0.707107,0.707107,0,-0.707107,0.707107,1,

如果我对照其他在线矩阵计算器检查它,它是错误的。我知道上三角形和对角线应该是我的 R 矩阵。 更令人惊讶的是,我得到了正确的行列式(我根据更简单的例子对其进行了检查)。 R 矩阵应该是唯一的,对吗?如果我想解决 15 乘以 15 的问题,我应该解决第一步...我希望有人能向我解释一下。我想预先说明一下,我尝试使用所有三个子例程来解决简单的 3 乘 3 系统,但它给出了毫无意义的结果。我希望一旦我做对了这个,我也会理解 dormqr 和 drtrs 的问题。

干杯!

这似乎是行主要与列主要问题。在 C/C++ 中,我们通常使用行优先矩阵,但在 FORTRAN 中(您使用的 lapack 可能已在其中实现)使用列优先格式。

尝试更改 A 中的行和列:

double A[9] = { 1, 0, 0, 1, 1, 1, 0, 0, 1 };

将您 post 编辑的矩阵视为列主矩阵并将其插入在线 QR 计算器 (http://www.bluebit.gr/matrix-calculator/) 我得到了您 post 的 R 矩阵,除了第一行的符号倒转,这意味着第一个 Q 向量正好指向相反的方向。