其他分享
首页 > 其他分享> > C线性代数库armadillo:如何在Matlab中使用eig_pair获得与eig函数相同的结果?

C线性代数库armadillo:如何在Matlab中使用eig_pair获得与eig函数相同的结果?

作者:互联网

我尝试使用eig_pair对具有相同大小的一对一般密集方阵A和B进行特征分解,以使A * eigvec = B * eigvec * diagmat(eigval),但结果与Matlab函数eig不匹配.例如:

A= [1,2;3,4]     B=[2,4;5,8]

在Matlab中:

[u,v] = eig(A,B)

结果:

u =

 -1.0000   -0.0000

 0.5000   -1.0000

v =

    1.0000         0
         0    0.5000

在犰狳:

eig_pair(v,u,A,B)

结果:
U:

9.9301e-016     -1.0000e+000

1.0000e+000      5.0000e-001

五:

0.5000

1.0000

我的问题是:如何获得与Matlab中的结果相匹配的u和v值?
期待您的回复!!!

解决方法:

特征向量不是唯一的.如果u是一个特征向量,则m * u对于所有m!= 0也是.*此外,eig在Matlab中返回特征向量的顺序是任意的. (我不知道Armadillo返回特征向量的顺序.)您可以尝试通过对特征值进行排序来为特征向量创建规范的顺序,但是如果您具有复杂的特征值,这将是一个问题. (回想一下,真实矩阵可以具有复杂的特征值.)

因此,(-1.0000,0.5000)(在Matlab中u的第一列)与(-1.0000e 000,5.0000e-001)(在Armadillo中u的第二列)是相同的特征向量.同样,当您按-1缩放并考虑浮点错误时,(-0.0000,-1.0000)等效于(9.9301e-016,1.0000e 000).请注意,可能存在数值精度误差,即使数学上的数字相等,浮点值也可能不相等.

如果要特征向量的规范表示,则可以将其重新缩放为范数为1,如果第一个元素的符号为负,则还可以乘以-1.当然,如果特征向量中的第一个元素接近于0,这又是有问题的,因为由于数值原因,该值可能刚好落在零的错误一侧.因此,考虑一下,最好确保最大的元素(在归一化之后)(而不是第一个元素)为正.

标签:eigenvector,c,matlab,armadillo
来源: https://codeday.me/bug/20191009/1881313.html