使用Eigen的SelfAdjointEigenSolver求解特征问题时特征向量异常
Eigen库SelfAdjointEigenSolver特征向量验证异常问题
我尝试用Eigen库的SelfAdjointEigenSolver求解特征问题,特征值结果正常,但特征向量似乎不符合特征问题定义。按特征问题定义,计算vct2 = matrix * vct后,vct2应该等于λ*vct(λ为对应特征值),但打印vct2与vct对应元素的比值时,结果并非恒定值,比如某次输出为:9.89816 4.10161 -0.765191 -2.27482 3.58762 0.710447 -4.79855 -2.88263 -3.05201 -3.05561。
问题复现代码
#include<iostream> #include <Eigen/Dense> using Eigen::MatrixXd; using Eigen::SelfAdjointEigenSolver; using namespace Eigen; using namespace std; int main(int argc, char **argv) { SelfAdjointEigenSolver<MatrixXd> es; MatrixXd matrix=MatrixXd::Random(10,10); es.compute(matrix); double E0=es.eigenvalues()[0]; VectorXd vct=es.eigenvectors().col(0); VectorXd vct2=matrix*vct; for(int i=0;i<10;i++) { cout<<vct2(i)/vct(i)<<" "; } return 0; }
更新与排查方向
无法通过简单复现方案重现问题,推测问题并非来自Eigen本身,而是自身使用的矩阵存在问题。参考非自伴随矩阵的相关案例,怀疑需要检查矩阵是否为自伴随矩阵(理论上应该满足,但暂未找到其他原因)。
对称实矩阵测试代码(无异常)
#include<iostream> #include <Eigen/Dense> using Eigen::MatrixXd; using Eigen::SelfAdjointEigenSolver; using namespace Eigen; using namespace std; int main(int argc, char** argv) { SelfAdjointEigenSolver<MatrixXd> es; MatrixXd a = MatrixXd::Random(30, 30); MatrixXd matrix = a + a.transpose(); es.compute(matrix); double E0 = es.eigenvalues()[0]; VectorXd vct = es.eigenvectors().col(0); VectorXd vct2 = matrix * vct; for (int i = 0; i < 10; i++) { cout << vct2(i) / vct(i) << " "; } return 0; }
内容的提问来源于stack exchange,提问作者martes
相关产品推荐
相关产品推荐

