用于计算错误特征值的c ++的特征

时间:2017-06-05 19:16:29

标签: c++ eigen

所以我在代码块中使用Eigen for C ++来计算我的矩阵的特征值。处理此问题的代码的具体部分如下: -

EigenSolver<MatrixXd> b(B,false);
cout<<" Eigen values are: \n "<<b.eigenvalues()<<"\n"; 

我遇到的问题是,为我的矩阵B计算的一个特征值与我在calculator.vhex.net上找到的实际特征值无关。

例如,对于矩阵

  

1 0 0 x

     

0 1 x 0

     

0 x 1 y

     

x 0 y 1

其中x = -1 / sqrt(2)且y = -0.5,特征值为0,0.5,1.5和2.

但是,我的代码将它们计算为-4.25e-016,0.5,1.5和2.

我也尝试过5x5矩阵,它应该有一个特征值4e-06,但代码计算为1.4413e-017。

这可能是什么原因?它们是近似值吗? 我的猜测是内存问题,2的平方根的双重类型值不会完全等于2的平方根,但我不确定这一点。

这有什么可能的解决办法?

3 个答案:

答案 0 :(得分:5)

当矩阵接近奇异时,寻找特征值可能很困难,用0特征值表示。你不应该期望从数值解中得到精确的特征值0,因为只有在接近该点时才会失败的一些数值近似值才会很好。

答案 1 :(得分:0)

除了@drglove所说的,对于对称(或自伴)特征值问题,你应该使用SelfAdjointEigenSolver

SelfAdjointEigenSolver<MatrixXd> b(B,EigenvaluesOnly);

这当然仍然只是一个数值解决方案,因此您仍然可以获得精度有限的解决方案。

答案 2 :(得分:0)

我猜这取决于所使用的特征值分解技术。您可以在这里找到更多信息:https://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html

这是针对selfadjoint matrices

完成的操作
std::vector<std::tuple<float, Eigen::VectorXf>> eigen_vectors_and_values; 
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> eigensolver(covariance_matrix);
if (eigensolver.info() != Eigen::Success) {
    return;
}
Eigen::VectorXf eigen_values = eigensolver.eigenvalues();
Eigen::MatrixXf eigen_vectors = eigensolver.eigenvectors();

std::cout<< "eigen_vectors" << eigen_vectors << std::endl;
std::cout<< "eigen_values" << eigen_values << std::endl;

对于一般矩阵

Eigen::EigenSolver<Eigen::MatrixXf> eigensolver;
eigensolver.compute(covariance_matrix);
Eigen::VectorXf eigen_values = eigensolver.eigenvalues().real();
Eigen::MatrixXf eigen_vectors = eigensolver.eigenvectors().real();

std::cout<< "eigen_vectors" << eigen_vectors.real() << std::endl;
std::cout<< "eigen_values" << eigen_values.real() << std::endl;

协方差矩阵是要在其中计算特征值和特征向量的矩阵。