GeneralizedEigenSolver不在特征库中给出特征向量

时间:2015-04-21 03:57:03

标签: c++ matrix linear-algebra eigen eigenvector

我是Eigen库的新手,试图解决广义特征值问题。根据特征库here中的GeneralizedEigenSolver模板类的文档,我能够得到特征值,但不能得到特征向量。似乎没有实现eigenvectors()成员函数。一旦我知道了特征值,还有其他方法可以生成特征向量。我使用的是特征3.2.4。

2 个答案:

答案 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例程。