Arpack ++ разреженный собственный решатель во много раз медленнее, чем эквивалентные Matlab eigs ()

Мне нужно вычислить n собственных векторов наименьшей величины очень большой разреженной симметричной матрицы в программе на C ++. Для моего примера, скажем, n = 30 и матрица 10k на 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

Из моего исследования по теме Matlab eigs() также вызывает ARPACK fortran libs для тех же вычислений, поэтому я не понимаю, почему оболочка C ++ намного медленнее.

Кроме того, ARPACK ++ ведет себя очень странно во многих ситуациях, например, когда я пытаюсь использовать float вместо double, программа просто останавливается и ничего не делает, пока я не сдам его, или когда пытаюсь вычислить собственные векторы вокруг значения, такого как 0 или 0,0001, что должно быть эквивалентным «SM», он просто выплевывает мусор и вылетает.

Поэтому я сомневаюсь, что ARPACK ++ действительно такой медленный, или все это — симптомы какой-то плохой конфигурации / установки, и если да, что я могу сделать, чтобы решить эту проблему.
Спасибо за любую помощь, которую вы можете предоставить.

3

Решение

Задача ещё не решена.

Другие решения