Lik*_*kon 6 c++ performance sparse-matrix eigen arpack
我需要在 C++ 程序中计算一个非常大的稀疏对称矩阵的 n 个最小幅度特征向量。对于我的示例,假设 n=30 并且矩阵是 10k x 10k,其中大约有 70k 个非零值。
在对一些库进行大量研究和试验后,我发现 ARPACK++ 可能是我最好的选择,我按照本页中的步骤安装了它。
使用以下代码段进行计算:
// 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
Run Code Online (Sandbox Code Playgroud)
这让我得到了正确的结果,但需要大约 8.5 秒,而在 Matlab 中,我只需通过调用即可在大约 0.5 秒内获得相同的结果
tic
[V,D] = eigs(L,30,'sm');
toc
Run Code Online (Sandbox Code Playgroud)
根据我对 Matlab 主题的研究,eigs()还为相同的计算调用了 ARPACK fortran 库,所以我不明白为什么 C++ 包装器如此之慢。
此外,ARPACK++ 在许多情况下的行为非常奇怪,例如当我尝试使用浮点数而不是双精度数时,程序将简单地停止并且什么都不做,直到我将其取下,或者当尝试计算 0 或 0.0001 等值附近的特征向量时,这应该相当于'SM',它只是吐出垃圾并崩溃。
因此,我怀疑 ARPACK++ 是否真的那么慢,或者所有这些都是一些错误配置/安装的症状,如果是这样,我可以做些什么来解决它。感谢您的任何帮助,您可以提供。
小智 1
尽管这篇文章相当老了,但我还是想分享一下我使用 ARPACK 和 C++ 的经验:
我的 C++ 项目中也需要 ARPACK,但我没有使用 ARPACK++ 包。相反,有一个非常好的且仍在维护的Github 存储库,称为arpack-ng,它还使用于计算极值特征值的所有主要例程可通过 C++ 头文件使用。它还包括 ARPACK 的并行版本,称为 PARPACK。
在这里查看: https: //github.com/opencollab/arpack-ng