我是Eigen库的新手,试图解决广义特征值问题。根据特征库here中的GeneralizedEigenSolver模板类的文档,我能够得到特征值,但不能得到特征向量。似乎没有实现eigenvectors()成员函数。一旦我知道了特征值,还有其他方法可以生成特征向量。我使用的是特征3.2.4。
答案 0 :(得分:1)
它似乎尚未实施。在compute
函数的末尾有:
m_eigenvectorsOk = false;//computeEigenvectors;
表示它们实际上并未计算。此外,eigenvectors()
函数已注释掉并且看起来像(注意TODO):
//template<typename MatrixType>
//typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType GeneralizedEigenSolver<MatrixType>::eigenvectors() const
//{
// eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
// eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
// Index n = m_eivec.cols();
// EigenvectorsType matV(n,n);
// // TODO
// return matV;
//}
如果您想从单个矩阵中获取特征值,可以使用EigenSolver
,如下所示:
int main(int argc, char *argv[]) {
Eigen::EigenSolver<Eigen::MatrixXf> es;
Eigen::MatrixXf A = Eigen::MatrixXf::Random(4,4);
es.compute(A);
std::cout << es.eigenvectors() << std::endl;
return 0;
}
答案 1 :(得分:1)
奇怪的是,这并没有实现,文档表明它是。它绝对值得在Eigen邮件列表或提交票据上询问,也许有人正在研究它并且它在最新的存储库中。
我过去使用的是GeneralizedSelfAdjointEigenSolver
,它肯定会产生特征向量。因此,如果您知道两个矩阵都是对称的,则可以使用它。
如果您的矩阵非常小,作为快速解决方案,您可以将标准EigenSolver
应用于M^{-1} A
,因为
A x = lambda * M x <==> M^{-1} A x = lambda * x,
但显然这需要你计算右手边矩阵的倒数,这是非常昂贵的,所以这真的是最后的手段。
如果所有其他方法都失败了,您可以使用专用的eigensolver库,例如FEAST,或者使用LAPACK例程。