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

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

使用以下代码段进行计算:

// 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++在许多情况下的表现也很奇怪,例如,当我尝试使用浮点数而不是 double 数时,程序将停止并不执行任何操作直到将其取下,或者尝试围绕0或0.0001之类的值计算特征向量时,等同于“SM”,它只会吐出垃圾并崩溃。

因此,我的疑问是ARPACK++是否真的那么慢,或者所有这些都是某些错误的配置/安装的症状,如果是,我该怎么办才能解决。
感谢您的任何帮助,您可以提供。

最佳答案

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

我在C++项目中也需要ARPACK,但是我没有使用ARPACK++软件包。取而代之的是一个非常好的仍然维护着的 Github-repo,称为 arpack-ng ,它也使所有用于计算极值特征值的主要例程都可以通过C++头文件使用。它还包括称为PARPACK的ARPACK并行版本。

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

09-07 04:13