使用eigen3 /稀疏的稀疏特征值

Phi*_*ipp 5 c++ eigenvalue eigen3

有没有找到一个真正的特征向量的独特和有效的方式,对称的,非常大的,比方说10000x10000,在稀疏矩阵Eigen3?密集矩阵有一个特征值求解器,但它没有利用矩阵的性质,例如它的对称性.此外,我不想将矩阵存储在密集中.

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

Rus*_*lan 5

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

另一个答案中建议的犰狳不同,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';
    }
}
Run Code Online (Sandbox Code Playgroud)


Sim*_*ons 4

犰狳将使用eigs_sym

请注意,无论您做什么,计算所有特征值都是一个非常昂贵的操作,通常所做的只是找到 k 个最大或最小的特征值(这就是它要做的)。