6

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

正しい結果が得られますが、約 8.5 秒かかりますが、Matlab では、呼び出すだけで約 0.5 秒で同じ結果を得ることができます

tic
[V,D] = eigs(L,30,'sm');
toc

トピックに関する私の調査から、Matlabeigs()は同じ計算のために ARPACK fortran ライブラリも呼び出すため、なぜ C++ ラッパーが非常に遅いのかわかりません。

また、ARPACK++ は、double の代わりに float を使用しようとすると、プログラムが単に停止し、削除するまで何もしない、または 0 や 0.0001 などの値の周りの固有ベクトルを計算しようとする場合など、多くの状況で非常に奇妙に動作します。 'SM' と同等である場合、単にゴミを吐き出してクラッシュします。

したがって、私の疑問は、ARPACK++ が本当に遅いのか、それともこれらすべてが不適切な構成/インストールの症状なのか、もしそうなら、それを解決するために何ができるのかということです。ご協力いただきありがとうございます。

4

1 に答える 1