4

所以我注意到对于全 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. 为什么?这是由于 1 矩阵的退化造成的吗?
  2. 如何在 C 中复制 Python 的结果?

任何见解将不胜感激。

4

2 回答 2

2

全部正确。您的矩阵有两个特征值,4 和 0。4 的特征空间是由 [1,1,1,1] 跨越的线,其中的倍数显示在所有列表中。0 的特征空间是 3 空间 x_1 + x_2 + x_3 + x_4 = 0。这三种方法都为您提供了该子空间的不同基础——除了 numpy,它只为您提供跨越二维子空间的向量,对于某些原因。

在我看来,DGEEV 的结果是您报告的最好的结果,因为它们以合理的阶梯形形式为 0 特征空间提供了正交基础。

于 2016-12-28T15:49:16.707 回答
1

四个特征值中有三个是 0(尝试values在 Python 脚本中打印出来)。因为矩阵的所有元素都是相同的(一个),所以元素相加为零的任何向量都是对应于零特征值的有效特征向量。究竟如何选择这个向量并不重要,因此不同的软件为零特征值找到不同的特征向量这一事实并不重要。您应该确认这些特征向量确实具有加起来为 0 的元素。

最后一个特征值是 4(非零),这意味着相应的特征向量必须具有相同的(非零)元素。然后,这些元素的确切值取决于特征向量的归一化,这在您的示例中似乎也有所不同。

总而言之,一切都很好,只是你的矩阵的特征向量非常不唯一。Wolfram Alpha找到了另一个我觉得更令人愉悦的解决方案。

更新

通常,a MbyM矩阵具有M特征值。如果其中两个(或更多)相同,则对应的特征向量存在无数种可能的实现,因为从这两个(称它们为v1v2),我们可以构造一个新的v3 = a*v1 + b*v2,其中ab是任意常数。

于 2016-12-28T15:54:18.127 回答