首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用特征3/稀疏的稀疏特征值

使用特征3/稀疏的稀疏特征值
EN

Stack Overflow用户
提问于 2015-05-12 02:42:50
回答 2查看 3.9K关注 0票数 5

Eigen3中,是否有一种寻找实的、对称的、非常大的,例如10000x10000稀疏矩阵的特征值和特征向量的方法?对于稠密矩阵有一个特征值求解器,但这没有利用矩阵的性质,例如它的对称性。此外,我也不想把矩阵存储在稠密的地方。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-12 02:55:13

[医]鲤鱼将使用eigs_sym完成这一任务。

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

票数 4
EN

Stack Overflow用户

发布于 2018-02-10 09:18:08

对于艾根来说,有一个名为光谱的图书馆。正如在其网页上所描述的,Spectra是使用C++语言重新设计ARPACK库的。

另一个答案中提出的Armadillo不同,Spectra确实支持long double和其他任何真正的浮点类型(例如boost::multiprecision::float128)。

下面是一个用法示例(与文档中的版本相同,但适用于不同浮点类型的实验):

代码语言:javascript
运行
AI代码解释
复制
#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';
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30188482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档