Las respuestas positivas más cercanas a su pregunta que pude encontrar son las perturbaciones diagonales dispersas (ver más abajo).
Dicho esto, no conozco ningún algoritmo para el caso general, aunque hay una generalización de la técnica que mencionó para los cambios escalares de las matrices SPD a todas las matrices cuadradas:
Dada cualquier matriz cuadrada , existe una descomposición de Schur A = U T U H , donde U es unitaria y T es triangular superior, y A + σ I = U ( T + σ I ) U H proporciona una descomposición de Schur de A + σ I . Por lo tanto, su idea de precomputación se extiende a todas las matrices cuadradas a través del algoritmo:AA=UTUHUTA+σI=U(T+σI)UHA+σI
- Calcule en el trabajo de O ( n 3 ) como máximo .[U,T]=schur(A)O(n3)
- Resuelva cada través de x : = U ( T + σ I ) - 1 U H b en el trabajo O ( n 2 ) (la inversión media es simplemente la sustitución inversa).(A+σI)x=bx:=U(T+σI)−1UHbO(n2)
Esta línea de razonamiento se reduce al enfoque que mencionó cuando es SPD ya que la descomposición de Schur se reduce a un EVD para matrices normales, y el EVD coincide con el SVD para matrices definidas positivas de Hermit.A
Respuesta a la actualización:
hasta que tenga una prueba, que no tengo, me niego a afirmar que la respuesta es "no". Sin embargo, puedo dar algunas ideas de por qué es difícil, así como otro subcampo donde la respuesta es sí.
La dificultad esencial es que, a pesar de que la actualización es diagonal, todavía está en rango completo, por lo que la herramienta principal para actualizar un inverso, la fórmula de Sherman-Morrison-Woodbury , no parece ayudar. Aunque el caso de desplazamiento escalar también es de rango completo, es un caso extremadamente especial ya que conmuta con cada matriz, como mencionó.
Dicho esto, si cada era escasa, es decir, cada uno tenía O ( 1 ) nonzeros, entonces la fórmula de Sherman-Morrison-Woodbury produce una solución de O ( n 2 ) con cada par { D , b } . Por ejemplo, con un único distinto de cero en la entrada diagonal j , de modo que D = δ e j e H j :DO(1)O(n2){D,b}jD=δejeHj
[A−1+δejeHj]−1=A−1−δA−1ejeHjA−11+δ(eHjA−1ej),
donde es el j ésimo vector base estándar .ejj
Otra actualización: debo mencionar que probé el preacondicionador que @GeoffOxberry sugirió en algunas matrices SPD 1000 × 1000 aleatorias usando PCG y, tal vez no sea sorprendente, parece reducir en gran medida el número de iteraciones cuando | El | D | El | 2 / | El | A | El | 2 es pequeño, pero no cuando es O ( 1 ) o mayor.A−11000×1000||D||2/||A||2O(1)