У меня есть два графика с почти n ~ 100000 узлов каждый. На обоих графиках каждый узел связан ровно с 3 другими узлами, поэтому матрица смежности является симметричной и очень разреженной.
Сложность в том, что мне нужны все собственные значения матрицы смежности, но не собственные векторы. Чтобы быть точным, это будет один раз в моей жизни (насколько я могу видеть, по крайней мере!), Поэтому я хочу получить все собственные значения и не против ждать несколько дней, чтобы получить их.
Я пробовал scipy
обертки вокруг ARPACK
, но это занимает слишком много времени. Я нашел несколько библиотек, но они лучше всего работают для получения подмножества самых больших / самых маленьких собственных значений. Есть ли библиотека, которая работает для симметричных разреженных матриц с, возможно, параллельной реализацией, чтобы получить все собственные значения?
Ответы:
Вы можете использовать сдвиг-инвертирование спектрального преобразования [1] и вычислять диапазон частот за диапазоном.
Техника также объясняется в моей статье [2]. Помимо реализации в [1], реализация доступна на C ++ в моем программном обеспечении Graphite [3] ( обновление 17 января : теперь все перенесено на версию 3 геограммы / графита ), которую я использовал для вычисления собственных функций оператора Лапласа для меш с до 1 миллиона вершин (проблема, которая похожа на вашу).
Как это устроено:
[1] http://www.mcs.anl.gov/uploads/cels/papers/P1263.pdf
[2] http://alice.loria.fr/index.php/publications.html?redirect=0&Paper=ManifoldHarmonics@2008
[3] http://alice.loria.fr/software/graphite/doc/html/
источник
Другим вариантом будет использование вращений Якоби. Так как ваша матрица уже почти диагональна, сходство не займет много времени. Обычно она сходится по линейной скорости, но после достаточного количества итераций скорость сходимости становится квадратичной.
источник