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

Sparse eigenvalues using eigen3/sparse

本文关键字:特征值 eigen3 使用      更新时间:2023-10-16

是否有一种独特而有效的方法来查找真实,对称,非常大的特征值和特征向量,例如1000000x10000, eigen33 的稀疏矩阵?有一个用于密集矩阵的特征值求解器,但这并不能使用矩阵的属性,例如这是对称的。此外,我不想将矩阵存储在密集中。

或(替代)是否有更好的( 更好的记录)库可以做到这一点?

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

与Armadillo不同,在另一个答案中建议,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';
    }
}

Armadillo将使用eigs_sym

进行此操作

请注意,计算所有 eigenvalues是一个非常昂贵的操作,无论您做什么,通常要做的就是仅找到最大或最小的特征值(这就是这样做的)。<<<<<<<<<<<<<<<</p>