对从特征值获得的特征值和特征向量进行排序的有效方法

时间:2019-05-27 09:56:50

标签: c++ sorting matrix linear-algebra eigen

我正在使用本征来求解对称矩阵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. 如何对特征值和特征向量进行排序? (以最终提取最大特征值和相应的vec)是否可以像Python一样进行类似的构造?

namely:

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

1 个答案:

答案 0 :(得分:1)

  
      
  1. 知道我的矩阵是对称的,这是对EigenSolver的有效利用吗?
  2.   

否,在这种情况下,您应该使用background-positionhttp://eigen.tuxfamily.org/dox/classEigen_1_1SelfAdjointEigenSolver.html

  
      
  1. 如何对特征值和特征向量进行排序? (以最终提取最大特征值和相应的vec)是否可以像Python一样进行类似的构造?
  2.   

SelfAdjointEigenSolver已经对特征值进行了排序(从最低到最高),即要获得最高的特征值/向量,您需要获取最后一个。

在这里可以对特征值进行排序,因为可以保证所有特征值都是实值(不对称EigenSolver不能保证)。 另一个优点是可以保证特征向量形成正交标准基(即对应的矩阵是unit /正交)。