2015-05-12 139 views
5

是否有一种独特而有效的方法找到一个真正的,对称的,非常大的特征值和特征向量,比如说10000x10000,稀疏矩阵Eigen3?对稠密矩阵有一个特征值求解器,但是它不利用矩阵的特性,例如它是对称的。此外,我不想将密度矩阵存储起来。使用特征3稀疏特征值/稀疏

或者(替代方案)是否有更好的(更好的记录)库来做到这一点?

回答

4

Armadillo会做到这一点使用eigs_sym

注意的是,计算所有特征值是不管你做什么,通常就要做一个非常昂贵的操作是找到只有k个最大或最小特征值(这是什么这会做)。

+0

这正是我一直在寻找,此外,它似乎是快速的图书馆。由于这是我的问题的答案,我会将其标记为已接受,但是您是否有使用Eigen进行此类任务的经验? – Philipp

+0

对于这些恐惧的事物,没有使用Eigen的经验。我倾向于使用犰狳几乎专门用于C++中的线性代数。从对文档的快速浏览中,没有看到我会有任何其他方式做你想要的东西,而无需手动编码使用稀疏矩阵的QR分解的东西。 –

1

对于Eigen,有一个名为Spectra的库。正如其网页上所述,Spectra是使用C++语言重新设计的ARPACK库。

与Armadillo不同,建议在another answer,Spectra支持long double和任何其他实际浮点类型(例如boost::multiprecision::float128)。

这里的(相同文件的版本,但适合与不同的浮点类型实验)使用的例子:

#include <Eigen/Core> 
#include <SymEigsSolver.h> // Also includes <MatOp/DenseSymMatProd.h> 
#include <iostream> 
#include <limits> 

int main() 
{ 
    using Real=long double; 
    using Matrix=Eigen::Matrix<Real, Eigen::Dynamic, Eigen::Dynamic>; 

    // We are going to calculate the eigenvalues of M 
    const auto A = Matrix::Random(10, 10); 
    const Matrix M = A + A.transpose(); 

    // Construct matrix operation object using the wrapper class DenseGenMatProd 
    Spectra::DenseSymMatProd<Real> op(M); 

    // Construct eigen solver object, requesting the largest three eigenvalues 
    Spectra::SymEigsSolver<Real, 
          Spectra::LARGEST_ALGE, 
          Spectra::DenseSymMatProd<Real>> eigs(&op, 3, 6); 

    // Initialize and compute 
    eigs.init(); 
    const auto nconv = eigs.compute(); 
    std::cout << nconv << " eigenvalues converged.\n"; 

    // Retrieve results 
    if(eigs.info() == Spectra::SUCCESSFUL) 
    { 
     const auto evalues = eigs.eigenvalues(); 
     std::cout.precision(std::numeric_limits<Real>::digits10); 
     std::cout << "Eigenvalues found:\n" << evalues << '\n'; 
    } 
} 
相关问题