2010-05-27 14 views
4

Je veux calculer un noyau de diffusion, ce qui implique de prendre exp (b * A) où A est une grande matrice. Pour jouer avec les valeurs de b, j'aimerais diagonaliser A (de sorte que exp (A) s'exécute rapidement).Outil pour diagonaliser les grandes matrices

Ma matrice fait environ 25k x 25k, mais elle est très clairsemée - seulement environ 60k valeurs sont non nulles. La fonction "eigs" de Matlab court de mémoire, de même que "eig" d'octave et "eigen" de R. Existe-t-il un outil pour trouver la décomposition de grandes matrices creuses? N ° si cela est pertinent, mais A est une matrice d'adjacence, donc c'est symétrique, et c'est un rang complet.

Répondre

0

Octave a splu qui fait la décomposition pour les matrices creuses. Je ne suis pas sûr si elle peut gérer 25k x 25k mais vaut le coup.

Alternativement, si votre matrice est structurée comme suit: A = [B zéros; zéros C], vous pouvez diagonaliser B et C séparément et les assembler en une seule matrice. Je suppose que vous pouvez faire quelque chose de similaire pour EIG.

+0

Question stupide, mais une fois que j'ai lu, comment l'utiliser? Je réalise que det (A) = det (L) * det (U), donc il doit y avoir une relation entre leurs diagonalisations, mais je ne suis pas assez intelligent pour le voir. – Xodarap

2

Avez-vous essayé SVD, svds pour la matrice clairsemée dans matlab.

EDIT: encore une chose, ne faites pas de SVD complet puisque la dimension est grande, utilisez un petit rang, disons 500, pour que votre solution entre dans la mémoire. Ceci coupe les petites valeurs propres et leurs vecteurs. Ainsi, cela ne nuit pas beaucoup à votre précision.

+0

@ A = USV '. S est une matrice carrée avec des eigenvaules sur sa diagonale. –

+1

+1 @duffymo: Voir wikipedia sur la relation entre la décomposition des valeurs propres et svd. En tout cas, le PO demandait la diagonalisation de A, ce que fait le svd. – vad

+0

J'ai essayé de le faire sur le mien et il a dit "taille variable maximale dépassée." Cependant, mon ordinateur n'est pas exactement haut de gamme, donc cela pourrait poser un problème là bas plutôt qu'avec matlab. – Xodarap

1

Avez-vous envisagé la following property: exp (A * t) = L^(- 1) {(sI-A)^(- 1)} où L^(- 1) la transformée de Laplace inverse? - à condition que vous puissiez inverser (sI-A)

+0

Je pense que laplace inverse s'exécute en O (n^4), ce qui est très lent. Il est également sujet à des erreurs. Voir http://www.cs.cornell.edu/cv/ResearchPDF/19ways+.pdf – Xodarap

1

Si vous avez accès à une machine 64 bits et une octave compilées avec un support 64 bits, vous pourrez peut-être contourner ce problème.

En outre, je ne sais pas sur quelle plate-forme vous exécutez tout cela, mais dans les systèmes UNIX, vous pouvez utiliser ulimit pour augmenter la taille de pile maximale autorisée pour les processus utilisateur.

Par exemple, vous pouvez exécuter

ulimit -u unlimited 

et cela fera en sorte qu'il n'y a pas de limite de mémoire etc sur vos processus. Ce n'est pas une bonne idée en général, car vous avez des processus d'emballement qui vont complètement ralentir votre machine. Essayez plutôt

pour augmenter la limite de taille de la pile.

Questions connexes