gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:15 25 4
gpt4 key购买 nike

如果您能帮助我解决以下问题,我将不胜感激。我偶然发现了这堵墙,我真的不知道这里有什么问题。我想用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 };

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

关于c++ - dgeqrf(LAPACK) 在 C++ 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com