La réponse positive la plus proche que j'ai pu trouver à votre question concerne les perturbations diagonales éparses (voir ci-dessous).
Cela dit, je ne connais aucun algorithme pour le cas général, bien qu'il y ait une généralisation de la technique que vous avez mentionnée pour les décalages scalaires des matrices SPD vers toutes les matrices carrées:
Étant donné n'importe quelle matrice carrée , il existe une décomposition de Schur A = U T U H , où U est unitaire et T est triangulaire supérieur, et A + σ I = U ( T + σ I ) U H fournit une décomposition de Schur de A + σ I . Ainsi, votre idée de pré-calcul s'étend à toutes les matrices carrées grâce à l'algorithme:AA=UTUHUTA+σI=U(T+σI)UHA+σI
- Calculer dans au plus O ( n 3 ) travail.[U,T]=schur(A)O(n3)
- Résolvez chaque via x : = U ( T + σ I ) - 1 U H b dans O ( n 2 ) (l'inversion du milieu est simplement une substitution de retour).(A+σI)x=bx:=U(T+σI)−1UHbO(n2)
Ce raisonnement se réduit à l'approche que vous avez mentionnée lorsque est SPD puisque la décomposition de Schur se réduit à un EVD pour les matrices normales, et l'EVD coïncide avec le SVD pour les matrices hermitiennes positives définies.A
Réponse à la mise à jour:
Tant que je n'ai pas de preuve, ce que je n'ai pas, je refuse de prétendre que la réponse est "non". Cependant, je peux donner un aperçu de la raison pour laquelle c'est difficile, ainsi qu'un autre sous-cas où la réponse est oui.
La difficulté essentielle est que, même si la mise à jour est diagonale, elle est toujours en général, donc le principal outil pour mettre à jour un inverse, la formule Sherman-Morrison-Woodbury , ne semble pas aider. Même si le cas de décalage scalaire est également de rang complet, c'est un cas extrêmement spécial car il commute avec chaque matrice, comme vous l'avez mentionné.
Cela dit, si chaque était rare, c'est-à-dire qu'ils avaient chacun O ( 1 ) nonzeros, alors la formule de Sherman-Morrison-Woodbury donne une résolution O ( n 2 ) avec chaque paire { D , b } . Par exemple, avec un seul non nul à la j ème entrée diagonale, de sorte 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),
où est le j ème vecteur de base standard .ejj
Autre mise à jour: je dois mentionner que j'ai essayé le préconditionneur que @GeoffOxberry a suggéré sur quelques matrices SPD 1000 × 1000 aléatoires utilisant PCG et, ce qui n'est peut-être pas surprenant, il semble réduire considérablement le nombre d'itérations lorsque | | D | | 2 / | | A | | 2 est petit, mais pas lorsqu'il est O ( 1 ) ou plus.A−11000×1000||D||2/||A||2O(1)