2016-09-28 9 views
1

У меня есть диагональная матрица с собственными значениями, например. 1, 2 и 3. Я нарушаю его значения с некоторым шумом, но он достаточно мал, чтобы изменить последовательность. Когда я получаю собственные значения этой матрицы, они составляют 1,2,3 в 50% случаев и 1,3,2 в других 50%. Когда я делаю то же самое без шума, порядок всегда равен 1,2,3.Как получить исходный порядок собственных значений с использованием Eigen?

я получить собственные значения с помощью:

matrix.eigenvalues().real(); 

или с использованием:

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

В результате то же самое. Есть идеи, как это исправить?

ответ

2

Не существует «естественного» порядка для собственных значений несамосопряженной матрицы, так как они обычно сложны (даже для вещественнозначных матриц). Можно было бы сортировать их лексикографически (сначала реальным, затем сложным) или по величине, но Эйген не делает. Если вы посмотрите at the documentation, вы найдете:

Собственных значения повторяются в соответствии с их алгебраической кратностью, поэтому существует столько собственных значений как строки в матрице. Собственные значения не сортируются в каком-либо конкретном порядке.

Если матрица случается самосопряженная вы должны использовать SelfAdjointEigenSolver, конечно (что делает своего рода собственные, так как все они реальны и, следовательно, сортировкой). В противном случае вам нужно отсортировать собственные значения вручную по любому критерию, который вы предпочитаете.

N.B .: Результат matrix.eigenvalues() и es.eigenvalues() действительно должен быть таким же, поскольку применяется тот же самый алгоритм. По сути, первый вариант - это просто короткая рука, если вас интересуют только собственные значения.