Eu tenho dois gráficos com quase n ~ 100000 nós cada. Nos dois gráficos, cada nó é conectado a exatamente 3 outros nós, portanto a matriz de adjacência é simétrica e muito esparsa.
A parte difícil é que eu preciso de todos os autovalores da matriz de adjacência, mas não dos autovetores. Para ser preciso, isso será uma vez na minha vida (pelo menos até onde eu posso ver!), Então eu quero obter todos os autovalores e não me importo de esperar alguns dias para obtê-los.
Tentei scipy
invólucros ARPACK
, mas leva muito tempo. Encontrei várias bibliotecas, mas elas funcionam melhor para obter um subconjunto dos maiores / menores valores próprios. Existe alguma biblioteca que funcione para matrizes esparsas simétricas com implementação possivelmente paralela para obter todos os autovalores?
Respostas:
Você pode usar a transformação espectral shift-inverter [1] e calcular a faixa de espectro por banda.
A técnica também é explicada no meu artigo [2]. Além da implementação em [1], uma implementação está disponível em C ++ no meu software Graphite [3] ( atualização em 17 de janeiro : agora tudo está portado para a versão 3 do geograma / grafite ), que eu costumava computar as funções próprias do operador Laplace para malhas com até 1 milhão de vértices (um problema semelhante ao seu).
Como funciona:
[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/
fonte
Outra opção seria usar rotações Jacobi. Como sua matriz já é quase diagonal, não deve demorar muito tempo para convergir. Geralmente, converge em taxa linear, mas após iterações suficientes, a taxa de convergência se torna quadrática.
fonte