我正在尝试使用 Eigen 库解决特征问题。我正在使用 SelfAdjointEigenSolver 来获取特征值和特征向量。虽然我似乎有很好的证据证明特征值是可以的,但特征向量似乎不行。或者我理解错了。
计算特征向量 vct 后,我创建另一个 vct2=matrixvct。特征值问题的核心思想是 vct2=lambdavct,其中 lambda 是特征值。因此,我打印了 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;
}
好的。我无法通过简单的解决方案来复制该问题。问题很可能不是来自特征本身,而是来自我的矩阵。事实上,我在这里看到解决非自伴随矩阵的类似问题表明,也许我应该检查我的矩阵是否是自伴随的。应该是的,但除此之外我看不到别的。
这是具有对称实矩阵的代码(因此,也是自伴随的)。它没有显示任何类似的问题。
#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;
}