Мне нужно вычислить 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 ++ действительно такой медленный, или все это — симптомы какой-то плохой конфигурации / установки, и если да, что я могу сделать, чтобы решить эту проблему.
Спасибо за любую помощь, которую вы можете предоставить.
Задача ещё не решена.