gpt4 book ai didi

C++ 线性代数库 Armadillo : how to use eig_pair to get the same result as eig function in Matlab?

转载 作者:行者123 更新时间:2023-11-30 01:53:55 24 4
gpt4 key购买 nike

我尝试使用 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

在 Armadillo 中:

eig_pair(v,u,A,B)

结果:你:

9.9301e-016     -1.0000e+000

1.0000e+000 5.0000e-001

v:

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 的第二列)。类似地,(-0.0000, -1.0000) 等同于 (9.9301e-016, 1.0000e+000) 当您按 -1 缩放并考虑浮点错误时。请注意,可能存在数值精度错误,这会导致浮点值比较不相等,即使在数学上 数字相等也是如此。

如果您想要特征向量的规范表示,您可以将它们重新调整为范数 1,如果第一个元素的符号为负,则还可以乘以 -1。当然,如果特征向量中的第一个元素接近于 0,这又是一个问题,因为由于数值原因,该值可能刚好在零的错误一侧结束。所以仔细想想,确保最大的元素(归一化后)——而不是第一个——是正数可能更好。

关于C++ 线性代数库 Armadillo : how to use eig_pair to get the same result as eig function in Matlab?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22634638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com