我需要在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