c+的特征值+;计算错误的特征值 >我在代码块中使用C++的特征值来计算矩阵的特征值。代码中处理此问题的具体部分如下所示:- EigenSolver<MatrixXd> b(B,false); cout<<" Eigen values are: \n "<<b.eigenvalues()<<"\n"; EigenSolver b(b,false); cout

c+的特征值+;计算错误的特征值 >我在代码块中使用C++的特征值来计算矩阵的特征值。代码中处理此问题的具体部分如下所示:- EigenSolver<MatrixXd> b(B,false); cout<<" Eigen values are: \n "<<b.eigenvalues()<<"\n"; EigenSolver b(b,false); cout,c++,eigen,C++,Eigen,当矩阵接近奇异值时,很难找到特征值,用0表示。你不应该期望数值解的精确特征值为0,因为它只适用于在该点附近开始失效的数值近似。除了@drglood所说的,对于对称(或自伴)特征值问题,你应该使用: 自伴特征解算器b(b,仅特征值); 当然,这仍然只是一个数值解,所以你仍然可以得到精度有限的解。我想这取决于使用了哪种特征值分解技术。您可以在此处找到更多信息: 这就是为什么要这样做 std::向量特征向量和值; 特征:自伴特征解算器特征解算器(协方差矩阵); if(eigensolver.info

当矩阵接近奇异值时,很难找到特征值,用0表示。你不应该期望数值解的精确特征值为0,因为它只适用于在该点附近开始失效的数值近似。

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

自伴特征解算器b(b,仅特征值);

当然,这仍然只是一个数值解,所以你仍然可以得到精度有限的解。

我想这取决于使用了哪种特征值分解技术。您可以在此处找到更多信息:

这就是为什么要这样做

std::向量特征向量和值;
特征:自伴特征解算器特征解算器(协方差矩阵);
if(eigensolver.info()!=Eigen::Success){
返回;
}
特征::向量xf特征值=特征解算器.特征值();
特征::矩阵XXF特征向量=特征解算器。特征向量();

请发布一个帖子来显示您的确切代码。此外,使用调试器逐步检查代码以查看它正在执行的操作。请注意,所有浮点值都是实数的近似值。你还应该了解浮点表示法的固有局限性。如果你了解一些数值线性代数的理论,这也会有所帮助-4.25e-016从许多角度来看都非常接近于0:)4e-06和1.4413e-017在浮点精度的限制范围内也非常接近。我不是要完整的代码。请花几分钟阅读我在第一篇评论中给出的链接。具体来说,在你的问题中,矩阵B的来源并不重要。你可以给出一个更简单的矩阵,甚至是硬编码的矩阵,只要你小心不要失去精度。重要的是,您需要提供足够的代码,任何人都可以复制和粘贴它,然后运行它,并获得与您要求的相同的结果。
SelfAdjointEigenSolver<MatrixXd> b(B,EigenvaluesOnly);
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;