Hice esto por primera vez recientemente, utilizando las sugerencias de mathSE.
SVD fue recomendado por la mayoría, creo, pero opté por la simplicidad de Cholesky:
Si la matriz , descompongo en una matriz triangular usando Cholesky, de modo que . Luego uso la sustitución hacia atrás o hacia adelante (dependiendo de si elijo que L sea triangular superior o inferior), para invertir , de modo que tenga . A partir de esto, puedo calcular rápidamente .M=AA⊤MLM=LL⊤LL−1M−1=(LL⊤)−1=L−⊤L−1
Empezar con:
M=AA⊤ , donde es conocido y es implícitamente simétrico y también es positivo-definido.M
Factorización de Cholesky:
METRO→ L L⊤ , donde es cuadrado y no singularL
Reemplazo de espalda:
L → L- 1 , probablemente la forma más rápida de invertir (aunque no me cite en eso)L
Multiplicación:
METRO- 1= ( L L⊤)- 1= L- ⊤L- 1
Notación utilizada: los
índices inferiores son filas, los índices superiores son columnas y es la transposición deL- ⊤L- 1
Mi algoritmo Cholesky (probablemente de Recetas Numéricas o Wikipedia)
Ljyo= Mjyo- Myo⋅ MjMETROyoyo- Myo⋅ Myo
Esto casi puede hacerse en el lugar (solo necesita almacenamiento temporal para los elementos diagonales, un acumulador y algunos iteradores enteros).
Mi algoritmo de sustitución de espalda (de Numerical Recipes, verifique su versión, ya que puede haber cometido un error con el marcado LaTeX)
( L- 1)jyo= ⎧⎩⎨1 / Lyoyo( - Lyo⋅ ( L- T)j) / Lyoyosi i=jde otra manera
A medida que aparece en la expresión, el orden que itera sobre la matriz es importante (algunas partes de la matriz de resultados dependen de otras partes que deben calcularse de antemano). Consulte el código de Recetas numéricas para ver un ejemplo completo en código. [Editar]: En realidad, solo verifique el ejemplo de Recetas numéricas. He simplificado demasiado el uso de productos de punto, hasta el punto de que la ecuación anterior tiene una dependencia cíclica, sin importar el orden que repita ...L- T