C++中通过Lapack-dpotrf进行的Choleskey分解给出了无效的结果



我正试图使用Lapack的dpotrf函数对1D双数组进行choleskey分解。它似乎在某些情况下有效,但在其他情况下它有奇怪的行为。

这是我的代码:

int main(){
int N=2;
int INFO;
double A2 [2*2] = {
1,1,
1,4
};
printf("%f %fn", A2[0], A2[1]);
printf("%f %fn", A2[2], A2[3]);
printf("n");
char UPLO='L';
LAPACK_dpotrf(&UPLO,&N,A2,&N,&INFO);
printf("%f %fn", A2[0], A2[1]);
printf("%f %fn", A2[2], A2[3]);
printf("n");
printf("2x2 working?: ");
printf("%in",INFO);
// double A3 [3*3] = {
//     1,1,1,
//     1,1,1,
//     1,1,4
// };
double A3 [3*3] = {
2,-1, 0,
-1, 2, -1, 
0, -1, 2
};
printf("%f %f %fn", A3[0], A3[1], A3[2]);
printf("%f %f %fn", A3[4], A3[5], A3[6]);
printf("%f %f %fn", A3[7], A3[8], A3[9]);
printf("n");
int N3=3;
LAPACK_dpotrf(&UPLO,&N3,A3,&N3,&INFO);
printf("%f %f %fn", A3[0], A3[1], A3[2]);
printf("%f %f %fn", A3[4], A3[5], A3[6]);
printf("%f %f %fn", A3[7], A3[8], A3[9]);
printf("n");
printf("%in",INFO);

return 0;
}

并通过构建

g++ main.cpp -lblas -llapack -llapacke

2x2案例给出:

1.000000 1.000000
1.000000 1.732051

从技术上讲,这是不正确的,因为它不是下三角形,但下部分是正确的

它正确地(可能是偶然的(识别出它不能在注释掉的A3矩阵上操作。

它正确地表明它可以在有效的A3上操作,但结果值是:

1.414214 -0.707107 0.000000
1.224745 -0.816497 0.000000
-1.000000 1.154701 0.000000

有效的Cholesky分解是(根据Matlab(:

1.4142         0         0
-0.7071    1.2247        0
0   -0.8165    1.1547

我怀疑这个函数没有被破坏,但我没有正确的论据
我怀疑它可能是LDA变量,因为我不知道这是什么,而其他LAPACK函数通常只将其设置为与N.相同的值

有人知道是什么原因导致了这个问题吗?

这是不正确的,因为它不是下三角

这是正确的,因为上三角形中的原始数据没有被覆盖。

在3x3的情况下,您打印了错误的元素。仔细看看。

最新更新