所以我注意到对于全 1 的 4x4 矩阵的特征分解,我得到了不同的答案。
在 Python 中使用 numpy.linalg.eig:
matrix = numpy.ones((M,M), dtype=float);
values, vectors = numpy.linalg.eig(matrix);
蟒蛇结果:
V1: [-0.866025 +0.288675 +0.288675 +0.288675]
V2: [+0.500000 +0.500000 +0.500000 +0.500000]
V3: [+0.391955 +0.597433 -0.494694 -0.494694]
V4: [+0.866025 -0.288675 -0.288675 -0.288675]
在 C 中使用 LAPACK DSYEV:
#define NN 4
#define LDA NN
void main(){
int n = NN, lda = LDA, lwork=NN*NN*NN*NN*NN, info;
char both = 'V';
char uplo = 'U';
double w[NN*NN];
double work[NN*NN*NN*NN*NN];
double a[LDA*NN] = {
1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1
};
dsyev_(&both, &uplo, &n, a, &lda, w, work, &lwork, &info);
return;
}
C DSYEV 结果:
V1: +0.000596 +0.000596 -0.707702 +0.706510
V2: +0.500000 +0.500000 -0.499157 -0.500842
V3: +0.707107 -0.707107 -0.000000 +0.000000
V4: +0.500000 +0.500000 +0.500000 +0.500000
在 C 中使用 LAPACK DGEEV:
#define NN 4
#define LDA NN
#define LDVL NN
#define LDVR NN
void main() {
char compute_left = 'V';
char compute_right = 'V';
int n = NN, lda = LDA, ldvl = LDVL, ldvr = LDVR, info, lwork=2*NN*NN;
double work[2*NN*NN];
double wr[NN], wi[NN], vl[LDVL*NN], vr[LDVR*NN];
double a[LDA*NN] = {
1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1
};
dgeev_( &compute_left, &compute_right, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, work, &lwork, &info );
return;
}
C DGEEV 结果:
V1: -0.866025 +0.288675 +0.288675 +0.288675
V2: -0.500000 -0.500000 -0.500000 -0.500000
V3: -0.000000 -0.816497 +0.408248 +0.408248
V4: -0.000000 -0.000000 -0.707107 +0.707107
结果都是不一样的!
所以我有两个主要问题:
- 为什么?这是由于 1 矩阵的退化造成的吗?
- 如何在 C 中复制 Python 的结果?
任何见解将不胜感激。