c++ - 使用 eigen3/sparse 的稀疏特征值

标签 c++ eigenvalue eigen3

Eigen3 中,是否有一种独特而有效的方法来查找实数、对称、非常大(比方说 10000x10000)稀疏矩阵的特征值和特征向量?有一个用于稠密矩阵的特征值求解器,但它没有利用矩阵的属性,例如它是对称的。此外,我不想密集存储矩阵。

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

最佳答案

对于 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';
    }
}

关于c++ - 使用 eigen3/sparse 的稀疏特征值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30188482/

相关文章:

c++ - 将动态变量添加到 url

Python OpenCV PCA计算特征值

Python 特征值计算比我计算机上的 MATLAB 慢得多。为什么?

python - Python 中的 eig(a,b) 给出错误 "takes 1 positional argument but 2 were given"

c++ - Eigen::Vector3f 对齐

c++ - 声明指针变量的不同类型

c++ - 执行特定功能取决于类型

c++ - cURL - Linux 上的 "hanging"套接字连接

c++ - 是否可以通过共享内存从不同进程更新 Eigen3 或其他矩阵库 2D 矩阵?

c++ - 在没有内存开销的情况下设置 Eigen::SparseMatrix 的稀疏模式