Actualización diagonal de una matriz simétrica positiva definida

19

n × n G n n GA es una matriz dispersa simétrica positiva definida (SPD). es una matriz diagonal escasa. es grande ( > 10000) y el número de nonzeros en suele ser de 100 ~ 1000.n×nGnnG

L D L TA ha sido factorizar en forma de Cholesky como .LDLT

¿Cómo actualizar y eficiente cuando convierte en ?D A A + GLDAA+G


fuente
¿G tiene solo elementos positivos? Si es así, aquí hay un límite superior trivial: vea la actualización diagonal como una suma de actualizaciones de rango uno. Existen métodos O (n ^ 2) para calcular la factorización LDL ^ t de una actualización de rango uno (la búsqueda en Google proporciona ejemplos). Luego, su actualización diagonal se ejecutará en O (rn ^ 2) donde r es el número de elementos diagonales distintos de cero de G. Dada la naturaleza específica de estas actualizaciones, hay atajos para guardar algunos cálculos, pero no está claro si es posible reduzca el orden debajo de O (rn ^ 2).
3
Estoy de acuerdo: no creo que haya ninguna forma de hacer actualizaciones diagonales a una factorización de Cholesky más rápido que simplemente repetir la factorización, pero las actualizaciones de rango uno se pueden hacer en tiempo , y solo tiene que hacer una por cada uno distinto de cero en la diagonal de . GO(m2)G
Brian Borchers el
10
Para y en los cientos, va a ser difícil de superar refactorización . Si el tamaño de vuelve mucho más grande y es muy escaso, podría dar sus frutos. En cualquier caso, las posibles actualizaciones y aproximaciones están cubiertas en profundidad por ¿Pueden resolverse los sistemas lineales simétricos diagonales más fijos en un tiempo cuadrático después de la precomputación? . n n z ( G ) A A Gn104nnz(G)AAG
Jed Brown
55
Jed, creo que deberías promover tu comentario a una respuesta aquí.
Michael Grant

Respuestas:

3

La última versión del paquete CHOLMOD SuiteSparse (beta 4.4.5) admite la modificación de una fila / columna simétrica (actualización de rango 2) para descomposición , utilizando una API matlab (y C). Lo usé con éxito en uno de mis proyectos.LDLT

Puede usarlo para realizar a la factorización. Se basa en este documento.nnz(G)

Por lo tanto, la complejidad será . Donde puede reducirse significativamente cuando se usa un relleno que reduce la permutación para un escasoO(nnz(G)nnz(L))nnz(L)AA

El paquete se puede descargar desde aquí.

A continuación hay algunas notas que dio el propietario del paquete (Prof. Tim Davis):

API:

LD = ldlrowmod (LD, k) elimina la fila / columna k, estableciendo A (:, k) y A (k, :) en la fila / columna k de identidad.

LD = ldlrowmod (LD, k, C) reemplaza la fila kth / col de A (que debe ser la fila kth / col de identidad) con la columna dispersa C.

Complejidad:

O(nnz(L))nnz(L)O(n)O(n)

Relleno que reduce la permutación:

LDLTLDLTPAPTL

Yuval Atzmon
fuente