Existe-t-il un moyen rapide d'inverser une matrice dans Matlab?
J'ai beaucoup de grande taille (autour de 5000 x 5000) des matrices dont j'ai besoin pour inverser dans Matlab. J'ai réellement besoin de l'inverse, donc je ne peux pas utiliser mldivide au lieu de cela, ce qui est beaucoup plus rapide pour résoudre Ax=b pour juste un b.
Mon matrices sont à venir à partir d'un problème qui signifie qu'ils ont des belles propriétés. Tout d'abord, leur déterminant est 1, donc ils ne sont certainement inversible. Ils ne sont pas diagonalizable, bien que, ou je voudrais essayer de diagonlize, inverser, et ensuite les mettre en arrière. Leurs entrées sont des nombres réels (en fait rationnelle).
Je suis à l'aide de Matlab pour l'obtention de ces matrices et pour ça j'ai besoin de faire avec leurs inverses, donc je préfère une façon de vitesse de Matlab. Mais si il y a un autre langage que je peux utiliser sera plus rapide, alors s'il vous plaît laissez-moi savoir. Je ne connais pas beaucoup d'autres langues (un peu, mais de C et un peu de Java), donc si c'est vraiment compliqué dans une autre langue, alors je risque de ne pas être en mesure de l'utiliser. S'il vous plaît aller de l'avant et de le suggérer, bien que, dans le cas.
source d'informationauteur Daniel
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas vrai, parce que vous pouvez toujours utiliser
mldivide
pour obtenir l'inverse. Notez queA-1 = A-1 * I
. Dans MATLAB, c'est l'équivalent deSur ma machine, cela prend environ 10,5 secondes pour un
5000x5000
de la matrice. Notez que MATLAB possède uninv
fonction pour calculer l'inverse d'une matrice. Bien que cela prendra environ la même quantité de temps, il est moins efficace en termes de précision numérique (plus d'info dans le lien).Plutôt que
det(A)=1
c'est le condition numéro de votre matrice qui dicte comment exacte ou stable, l'inverse sera. Notez quedet(A)=∏i=1:n λi
. Mettez donc deλ1=M
λn=1/M
etλi≠1,n=1
vous donneradet(A)=1
. Cependant, commeM → ∞
cond(A) = M2 → ∞
etλn → 0
ce qui signifie que votre matrice est à l'approche de la singularité et il y aura de grandes erreurs numériques dans le calcul de l'inverse.Bien sûr, il existe d'autres algorithmes plus efficaces qui peuvent être utilisés si votre matrice est creuse ou a d'autres propriétés favorables. Mais sans plus d'infos sur votre problème spécifique, il n'y a rien de plus à dire.
MATLAB utilise élimination de Gauss pour calculer l'inverse d'une matrice (classement complet, non fragmentée, sans propriétés particulières) à l'aide de
mldivide
et c'estΘ(n3)
oùn
est la taille de la matrice. Donc, dans votre cas,n=5000
et il y a1.25 x 1011
d'opérations en virgule flottante. Ainsi, sur un raisonnable machine avec environ 10 Gflops de puissance de calcul, vous allez besoin d'au moins 12,5 secondes pour calculer l'inverse et il n'y a aucun moyen de sortir de cette, à moins d'exploiter les "caractéristiques particulières" (si elles sont exploitables)De l'inversion de l'arbitraire 5000 x 5000 matrice n'est pas de calcul facile quelle que soit la langue que vous utilisez. Je recommande à la recherche dans des approximations. Si votre matrices sont de faible rang, vous voudrez peut-être essayer un faible rang approximation M = USV'
Voici quelques idées de mathématiques-débordement:
https://mathoverflow.net/search?q=matrix+inversion+rapprochement
Première suppose que les propres valeurs sont toutes
1
. LaissezA
être la Jordanie forme canonique de votre matrice. Ensuite, vous pouvez calculerA^{ -1}
en utilisant uniquement de la matrice de multiplication et d'addition paroù
k < dim(A)
. Pourquoi ce travail? Parce que les fonctions génératrices sont impressionnantes. Rappel de l'expansionCela signifie que nous pouvons inverser
(1-x)
à l'aide d'une somme infinie. Vous souhaitez inverser une matriceA
si vous voulez prendreDes problèmes pour
X
donneX = I-A
. Par conséquent, la substitution, nous avonsIci, j'ai simplement utilisé la matrice identité
I
à la place du numéro1
. Maintenant, nous avons le problème de la convergence à traiter, mais ce n'est pas réellement un problème. Par l'hypothèse queA
est en Jordanie et a tous propres valeurs égales à1
nous savons queA
est triangulaire supérieure avec tous les1
s sur la diagonale. DoncI-A
est triangulaire supérieure avec tous les0
s sur la diagonale. Par conséquent, tous les propres valeurs deI-A
sont0
de sorte que son polynôme caractéristique estx^dim(A)
et son polynôme minimal estx^{k+1}
pour certainsk < dim(A)
. Depuis une matrice satisfait à son minimum (et caractéristique) polynôme, ce qui signifie que(I-A)^{k+1} = 0
. Par conséquent, la série ci-dessus est finisavec la plus grande valeur non nulle en terme de(I-A)^k
. Donc elle converge.Maintenant, pour le cas général, de mettre votre matrice en forme de la Jordanie, de sorte que vous avez un bloc triangulaire de la matrice, par exemple:
Où chaque bloc a une valeur unique le long de la diagonale. Si cette valeur est
a
pourA
puis utilisez l'astuce ci-dessus pour inverser1/a * A
puis multiplier lea
. Puisque la matrice est bloc triangulaire, l'inverse seraIl n'y a rien de spécial à propos de trois blocs, de sorte que cela fonctionne, peu importe combien vous en avez.
Noter que cette astuce fonctionne à chaque fois que vous avez une matrice en forme de la Jordanie. Le calcul de l'inverse dans ce cas sera très rapide dans Matlab, car il s'agit uniquement de multiplication de matrice, et vous pouvez même utiliser des astuces pour la vitesse que depuis vous avez seulement besoin de puissances d'une matrice. Cela ne peut pas vous aider, mais, si c'est vraiment coûteux d'obtenir la matrice en Jordanie formulaire.