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