编程语言
首页 > 编程语言> > C与Python中特征向量例程的不同结果

C与Python中特征向量例程的不同结果

作者:互联网

所以我注意到我得到了所有1的4×4矩阵的特征分解的不同答案.

在使用numpy.linalg.eig的Python中:

matrix = numpy.ones((M,M), dtype=float);
values, vectors = numpy.linalg.eig(matrix);

Python结果:

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的结果?

任何见解将不胜感激.

解决方法:

全部正确.你的矩阵有两个特征值,4和0. 4的本征空间是[1,1,1,1]所跨越的线,其中的一个显示在所有列表中. 0的本征空间是3空间x_1 x_2 x_3 x_4 = 0.这三个方法为每个子空间提供了不同的基础 – 除了numpy之外,由于某种原因,它只给出了跨越二维子空间的向量.

在我看来,DGEEV的结果是你报告的结果中最好的,因为它们以合理的阶梯形式给出0-本征空间的标准正交基础.

标签:python,c-3,numpy,eigenvector,lapacke
来源: https://codeday.me/bug/20190627/1308762.html