J'ai deux graphiques avec près de n ~ 100 000 nœuds chacun. Dans les deux graphiques, chaque nœud est connecté à exactement 3 autres nœuds, de sorte que la matrice d'adjacence est symétrique et très clairsemée.
La partie difficile est que j'ai besoin de toutes les valeurs propres de la matrice d'adjacence mais pas des vecteurs propres. Pour être précis, cela va être une fois dans ma vie (pour autant que je puisse voir, au moins!) Je veux donc obtenir toutes les valeurs propres et ne me dérange pas d'attendre quelques jours pour les obtenir.
J'ai essayé des scipy
emballages ARPACK
, mais cela prend beaucoup trop de temps. J'ai trouvé plusieurs bibliothèques mais elles fonctionnent mieux pour obtenir un sous-ensemble de valeurs propres les plus grandes / les plus petites. Existe-t-il une bibliothèque qui fonctionne pour les matrices clairsemées symétriques avec éventuellement une implémentation parallèle pour obtenir toutes les valeurs propres?
Réponses:
Vous pouvez utiliser la transformation spectrale à inversion de décalage [1] et calculer le spectre bande par bande.
La technique est également expliquée dans mon article [2]. Outre l'implémentation dans [1], une implémentation est disponible en C ++ dans mon logiciel Graphite [3] ( mise à jour 17 janvier : maintenant tout est porté sur géogramme / graphite version 3 ), que j'ai utilisé pour calculer les fonctions propres de l'opérateur Laplace pour mailles avec jusqu'à 1 million de sommets (un problème similaire au vôtre).
Comment ça fonctionne:
[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/
la source
Une autre option serait d'utiliser des rotations Jacobi. Puisque votre matrice est déjà presque diagonale, la convergence ne devrait pas prendre beaucoup de temps. En général, il converge en vitesse linéaire, mais après suffisamment d'itérations, la vitesse de convergence devient quadratique.
la source