Je l'ai fait pour la première fois récemment, en utilisant les suggestions de mathSE.
SVD a été recommandé par la plupart je pense, mais j'ai opté pour la simplicité de Cholesky:
Si la matrice , alors je décompose en une matrice triangulaire utilisant Cholesky, telle que . J'utilise ensuite la substitution arrière ou la substitution avant (selon que je choisis L pour être triangulaire supérieur ou inférieur), pour inverser , de sorte que j'ai . À partir de là, je peux calculer rapidement .M=AA⊤MLM=LL⊤LL−1M−1=(LL⊤)−1=L−⊤L−1
Commencer avec:
M=AA⊤ , où est connu et est implicitement symétrique et est également positif-défini.M
Factorisation de Cholesky:
M→LL⊤ , où est carré et non singulierL
Remplacement arrière:
L→L−1 , probablement le moyen le plus rapide pour inverser (ne me citez pas là-dessus cependant)L
Multiplication:
M−1=(LL⊤)−1=L−⊤L−1
Notation utilisée: les
indices inférieurs sont des lignes, les indices supérieurs sont des colonnes et est la transposition deL−⊤L−1
Mon algorithme Cholesky (probablement de Recettes numériques ou Wikipedia)
Lji=Mji−Mi⋅MjMii−Mi⋅Mi
Cela peut presque être fait sur place (vous n'avez besoin que d'un stockage temporaire pour les éléments diagonaux, un accumulateur et certains itérateurs entiers).
Mon algorithme de substitution arrière (à partir de Recettes numériques, vérifiez leur version car j'ai peut-être fait une erreur avec le balisage LaTeX)
(L−1)ji=⎧⎩⎨1/Lii(−Li⋅(L−T)j)/Liiif i=jotherwise
Comme apparaît dans l'expression, l'ordre que vous parcourez la matrice est important (certaines parties de la matrice de résultat dépendent d'autres parties de celle-ci qui doivent être calculées au préalable). Vérifiez le code des recettes numériques pour un exemple complet dans le code. [Modifier]: En fait, vérifiez simplement l'exemple de recettes numériques. J'ai trop simplifié trop en utilisant des produits scalaires, au point que l'équation ci-dessus a une dépendance cyclique quel que soit l'ordre dans lequel vous répétez ...L−T