我有一个具有特征值的对角矩阵1、2和3。我会在一些干扰下干扰它的值,但是它足够小,可以更改顺序。当我获得此矩阵的特征值时,在50%的情况下分别为1,2,3,在另外50%的情况下分别为1,3,2。
当我做同样的事情而没有噪音时,阶数总是1,2,3。
我使用以下方法获得特征值:
matrix.eigenvalues().real();
或使用:
Eigen::EigenSolver<Eigen::Matrix3d> es(matrix, false);
es.eigenvalues().real();
结果是一样的。任何想法如何解决?
最佳答案
非自伴矩阵的特征值没有“自然”顺序,因为它们通常很复杂(即使对于实值矩阵也是如此)。可以按字典顺序(首先按实数,然后按复数)或按大小对它们进行排序,但Eigen却不这样做。如果您看看at the documentation,将会发现:
如果您的矩阵碰巧是自伴的,则应该使用SelfAdjointEigenSolver
(它对特征值进行排序,因为它们都是真实的,因此可以排序)。否则,您需要根据自己喜欢的任何准则对特征值进行手动排序。
N.B .: matrix.eigenvalues()
和es.eigenvalues()
的结果确实应该相同,因为应用了完全相同的算法。本质上,如果您只对特征值感兴趣,则第一个变体只是简写。