2016-09-28 27 views
1

私は固有値を持つ対角行列を持っています。 1、2、3となります。ノイズを伴ってその値を乱すが、シーケンスを変更するのに十分小さい。この行列の固有値を求めると、50%の場合1,2,3、もう1つの50%の場合1,3,2です。 ノイズなしで同じことをすると、順序は常に1,2,3です。Eigenを使って固有値の元の順序を得るには?

Iは使用固有値を得る:

matrix.eigenvalues().real(); 

または使用:

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

結果は同じです。どのようにそれを修正するための任意のアイデア?

答えて

2

非自己結合行列の固有値は、通常は複素数なので(実数行列の場合でも)、自然な順序はありません。彼らは辞書編集法で(最初は実数から複素数で)並べ替えるか、大きさで並べ替えることができましたが、Eigenはどちらもしません。あなたが見at the documentationを持っている場合、あなたは見つけることができます:

固有値は、その代数多様性に応じて繰り返され、その行列の行と同数の固有値があります。 固有値は特定の順序でソートされません。

あなたの行列は、あなたが(彼らはすべての実ので、ソート可能であるため、固有値を並べ替えるん)もちろん、SelfAdjointEigenSolverを使用する必要があります自己随伴であることを起こる場合。それ以外の場合は、任意の基準で手動で固有値をソートする必要があります。

N.B .:正確に同じアルゴリズムが適用されるので、matrix.eigenvalues()es.eigenvalues()の結果は実際同じである必要があります。基本的に最初の変種は、固有値にのみ関心がある場合は、単なる短命です。

関連する問題