如何使用Eigen获得特征值的原始顺序?

时间:2016-09-28 21:34:18

标签: c++ eigen

我有一个带有特征值的对角矩阵,例如:我用一些噪声打扰了它的值,但它足够小以改变序列。当我获得该矩阵的特征值时,它们在50%的情况下为1,2,3,在另外50%的情况下为1,3,2。 当我做同样没有噪音的事情时,订单总是1,2,3。

我使用以下方法获得特征值:

matrix.eigenvalues().real();

或使用:

Eigen::EigenSolver<Eigen::Matrix3d> es(matrix, false);
es.eigenvalues().real();

结果是一样的。任何想法如何解决它?

1 个答案:

答案 0 :(得分:3)

没有&#34;自然&#34;非自伴随矩阵的特征值的阶数,因为它们通常是复杂的(即使对于实值矩阵)。人们可以按字典顺序排序(首先是真实的,然后是复杂的)或者按照幅度排序,但是Eigen没有。如果你看一眼at the documentation,你会发现:

  

特征值根据它们的代数多重性重复,因此矩阵中的行具有尽可能多的特征值。 特征值未按任何特定顺序排序。

如果你的矩阵碰巧是自伴的,你当然应该使用SelfAdjointEigenSolver(它会对特征值进行排序,因为它们都是真实的,因此可以排序)。否则,您需要按照您喜欢的标准手动对特征值进行排序。

N.B。:matrix.eigenvalues()es.eigenvalues()的结果确实应该相同,因为应用了完全相同的算法。如果你只对特征值感兴趣,基本上第一个变体只是一个简写。