我正试图使用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的情况下,您打印了错误的元素。仔细看看。