2016-09-28 5 views
1

Ich habe eine diagonale Matrix mit Eigenwerten, z.B. 1, 2 und 3. Ich störe seine Werte mit etwas Rauschen, aber es ist klein genug, um die Sequenz zu ändern. Wenn ich die Eigenwerte dieser Matrix erhalte, sind sie 1,2,3 in 50% Fällen und 1,3,2 in weiteren 50%. Wenn ich die gleiche Sache ohne das Geräusch mache, ist die Reihenfolge immer 1,2,3.Wie erhält man die ursprüngliche Reihenfolge der Eigenwerte mit Eigen?

erhalte ich die Eigenwerte mit:

matrix.eigenvalues().real(); 

oder mit:

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

Das Ergebnis ist das gleiche. Irgendwelche Ideen, wie man es repariert?

Antwort

2

Es gibt keine "natürliche" Ordnung für Eigenwerte einer nicht selbstadjungierten Matrix, da diese normalerweise komplex sind (sogar für reellwertige Matrizen). Man könnte sie lexikographisch (zuerst real, dann komplex) oder nach Größe sortieren, aber Eigen tut es auch nicht. Wenn Sie einen Blick at the documentation haben, werden Sie feststellen:

Die Eigenwerte wiederholt werden entsprechend ihrer algebraischen Mannigfaltigkeit, so gibt es so viele Eigenwerte als Zeilen in der Matrix. Die Eigenwerte sind nicht in einer bestimmten Reihenfolge sortiert.

Wenn Ihr Matrix selbstadjungiert sein geschieht Sie die SelfAdjointEigenSolver verwenden sollten, natürlich (die Art der Eigenwerte der Fall ist, da sie alle realen und daher sortierbar sind). Andernfalls müssen Sie die Eigenwerte manuell nach den von Ihnen bevorzugten Kriterien sortieren.

N. B .: Das Ergebnis matrix.eigenvalues() und es.eigenvalues() soll in der Tat das gleiche sein, da genau der gleiche Algorithmus angewandt wird. Im Wesentlichen ist die erste Variante nur ein Short-Hand, wenn Sie nur an den Eigenwerten interessiert sind.

Verwandte Themen