如果您能帮助我解决以下问题,将不胜感激。我绊倒在墙上,我真的不能说出这里出了什么问题。我想在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中的行和列:
双A [9] = {1,0,0,1,1,1,0,0,1};
将您发布的矩阵考虑为以列为主的矩阵,然后将其插入在线QR计算器(http://www.bluebit.gr/matrix-calculator/)中,我得到了您发布的R矩阵,除了第一行的符号反转,这意味着第一个Q向量仅指向相反的方向。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句