Arpack ++稀疏本征求解器比等效的Matlab eigs慢很多倍()

时间:2014-07-31 17:46:42

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

我需要在C ++程序中计算非常大的稀疏对称矩阵的n个最小幅度的特征向量。对于我的例子,假设n = 30,矩阵是10k乘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 ++表现得非常奇怪,例如当我尝试使用浮点数而不是双精度数时,程序将直接停止并且什么也不做,直到我将其取下,或者尝试计算围绕0或0.0001之类的值的特征向量,它应该等同于'SM',它只是吐出垃圾和崩溃。

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

1 个答案:

答案 0 :(得分:0)

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

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

在此处查看:https://github.com/opencollab/arpack-ng