【问题标题】:Arpack++ sparse eigen solver many times slower than equivalent Matlab eigs()Arpack++ 稀疏特征求解器比等效的 Matlab eigs() 慢很多倍
【发布时间】:2014-09-23 19:06:58
【问题描述】:

我需要在 C++ 程序中计算一个非常大的稀疏对称矩阵的 n 个最小幅度特征向量。在我的示例中,假设 n=30,矩阵为 10k x 10k,大约有 70k 个非零值。

在对一些库进行大量研究和试验后,我发现 ARPACK++ 可能是我最好的选择,我按照in this page 的步骤安装了它。

使用以下 sn-p 进行计算:

// L is an Eigen library matrix
L.makeCompressed();

ARluSymMatrix<MTYPE> A(L.cols(), L.nonZeros(), L.valuePtr(), L.innerIndexPtr(), L.outerIndexPtr(), 'U');

ARluSymStdEig<MTYPE> eig(n, A, "SM");

TIC
eig.FindEigenvectors();
TOC

这让我得到了正确的结果,但大约需要 8.5 秒,而在 Matlab 中,我只需调用即可在大约 0.5 秒内得到相同的结果

tic
[V,D] = eigs(L,30,'sm');
toc

根据我对 Matlab eigs() 主题的研究,还调用 ARPACK fortran 库进行相同的计算,所以我不明白为什么 C++ 包装器要慢得多。

此外,ARPACK++ 在许多情况下的行为都非常奇怪,例如当我尝试使用浮点数而不是双精度数时,程序将简单地停止并且什么都不做,直到我将其删除,或者当尝试计算 0 或 0.0001 之类的值周围的特征向量时,应该相当于'SM',它只是吐出垃圾和崩溃。

因此,我怀疑 ARPACK++ 是否真的那么慢,或者所有这些都是一些不良配置/安装的症状,如果是,我该怎么做才能解决它。 感谢您提供的任何帮助。

【问题讨论】:

  • 先生,5年后,您知道为什么会慢很多吗?

标签: c++ performance eigen sparse-matrix arpack


【解决方案1】:

虽然这篇文章比较老了,但我还是想分享一下我使用 ARPACK 和 C++ 的经验:

我的 C++ 项目中也需要 ARPACK,但我没有使用 ARPACK++ 包。相反,有一个非常好的仍在维护的 Github-repo,它被称为 arpack-ng,它还通过 C++ 头文件提供了计算极值特征值的所有主要例程。它还包括称为 PARPACK 的 ARPACK 并行版本。

在这里查看:https://github.com/opencollab/arpack-ng

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 2017-08-14
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2013-09-25
    相关资源
    最近更新 更多