我有一个带有特征值的对角矩阵,例如:我用一些噪声打扰了它的值,但它足够小以改变序列。当我获得该矩阵的特征值时,它们在50%的情况下为1,2,3,在另外50%的情况下为1,3,2。 当我做同样没有噪音的事情时,订单总是1,2,3。
我使用以下方法获得特征值:
matrix.eigenvalues().real();
或使用:
Eigen::EigenSolver<Eigen::Matrix3d> es(matrix, false);
es.eigenvalues().real();
结果是一样的。任何想法如何解决它?
答案 0 :(得分:3)
没有&#34;自然&#34;非自伴随矩阵的特征值的阶数,因为它们通常是复杂的(即使对于实值矩阵)。人们可以按字典顺序排序(首先是真实的,然后是复杂的)或者按照幅度排序,但是Eigen没有。如果你看一眼at the documentation,你会发现:
特征值根据它们的代数多重性重复,因此矩阵中的行具有尽可能多的特征值。 特征值未按任何特定顺序排序。
如果你的矩阵碰巧是自伴的,你当然应该使用SelfAdjointEigenSolver
(它会对特征值进行排序,因为它们都是真实的,因此可以排序)。否则,您需要按照您喜欢的标准手动对特征值进行排序。
N.B。:matrix.eigenvalues()
和es.eigenvalues()
的结果确实应该相同,因为应用了完全相同的算法。如果你只对特征值感兴趣,基本上第一个变体只是一个简写。