Эффективный способ сортировки собственных значений и собственных векторов, полученных из собственных - PullRequest
0 голосов
/ 27 мая 2019

Я использую Eigen для решения системы eigens для симметричной матрицы m, пример, приведенный ниже:

#include <iostream>
#include <Eigen/Dense>
#include <Eigen/Eigenvalues>
using namespace std;
using namespace Eigen;
int main()
{
  Matrix3f m(3,3);
  EigenSolver<Matrix3f> es;
  m(0,0) = -0.386087;
  m(1,1) = -0.390147;
  m(2,2) = 0.776234;
  m(0,1) = 0.00813956;
  m(0,2) = 0.0781361;
  m(1,0) = 0.0781361;
  m(1,2) = 0.0986476;
  m(2,0) = 0.0781361;
  m(2,1) = 0.0986476;
  es.compute(m,true);
  cout << "matrix is: " << m << endl;
  cout << "The eigenvalues of A are: " << es.eigenvalues() << endl;
  cout << "The eigenvalues of A are: " << es.eigenvectors() << endl;
}

и вывод:

matrix is:  -0.386087 0.00813956  0.0781361
0.00813956  -0.390147  0.0986476
 0.0781361  0.0986476   0.776234
The eigenvalues of A are: (-0.391002,0)
 (0.789765,0)
(-0.398762,0)
The eigenvalues of A are:   (0.976246,0) (-0.0666485,0)   (0.206158,0)
  (0.200429,0) (-0.0835865,0)  (-0.976136,0)
  (-0.08229,0)  (-0.994269,0)  (0.0682429,0)

Вопросы:

  1. Эффективно ли использовать EigenSolver, зная, что моя матрица симметрична?

  2. Как можноЯ сортирую собственные значения и соответственно собственные векторы?(чтобы в конечном итоге извлечь максимальное собственное значение и соответствующий вектор). Можно ли сделать аналогичную конструкцию, как это принято в Python?

, а именно:

idx = eigenValues.argsort()[::-1]   
eigenValues = eigenValues[idx]
eigenVectors = eigenVectors[:,idx]

1 Ответ

1 голос
/ 27 мая 2019
  1. Эффективно ли использовать EigenSolver, зная, что моя матрица симметрична?

Нет, в этом случае следует использовать SelfAdjointEigenSolver: http://eigen.tuxfamily.org/dox/classEigen_1_1SelfAdjointEigenSolver.html

Как я могу отсортировать собственные значения и, соответственно, собственные векторы?(чтобы в конечном итоге извлечь максимальное собственное значение и соответствующий ему vec) Можно ли сделать аналогичную конструкцию, как это принято в Python?

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

Здесь можно отсортировать собственные значения, поскольку гарантируется, что все собственные значения будут действительными (что не гарантируется для несимметричного EigenSolver).).Другое преимущество состоит в том, что собственные векторы гарантированно образуют ортогональную основу (т. Е. Соответствующая матрица является унитарной / ортогональной).

...