gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:56 24 4
gpt4 key购买 nike

我需要在 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++ 在许多情况下表现得非常奇怪,例如当我尝试使用 float 而不是 double 时,程序将简单地停止并且什么都不做,直到我将其取下,或者当尝试计算 0 或 0.0001 等值附近的特征向量时,应该等同于'SM',它只是吐出垃圾和崩溃。

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

最佳答案

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

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

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

关于c++ - Arpack++ 稀疏特征求解器比等效的 Matlab eigs() 慢很多倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25065649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com