所以我在代码块中使用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的平方根,但我不确定这一点。
这有什么可能的解决办法?
答案 0 :(得分:5)
当矩阵接近奇异时,寻找特征值可能很困难,用0特征值表示。你不应该期望从数值解中得到精确的特征值0,因为只有在接近该点时才会失败的一些数值近似值才会很好。
答案 1 :(得分:0)
除了@drglove所说的,对于对称(或自伴)特征值问题,你应该使用SelfAdjointEigenSolver
:
SelfAdjointEigenSolver<MatrixXd> b(B,EigenvaluesOnly);
这当然仍然只是一个数值解决方案,因此您仍然可以获得精度有限的解决方案。
答案 2 :(得分:0)
我猜这取决于所使用的特征值分解技术。您可以在这里找到更多信息:https://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html
完成的操作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;
协方差矩阵是要在其中计算特征值和特征向量的矩阵。