On cherche à utiliser l'expression suivante pour calculer une matrice inverse:
(A + U.C.V)^-1 = A^-1 - A^-1.U.(C^-1 + V.A^-1.U)^-1.V.A^-1
Le problème: comment choisir U
, V
et C
.
Prenons un exemple:
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
B = [1 2 3 4; 6 7 8 9; 9 10 11 12; 15 16 17 18];
On cherche à calculer B^-1
en connaissant A^-1
:
U.C.V
devra être égale à B - A = [0 0 0 0; 1 1 1 1; 0 0 0 0; 2 2 2 2];
Le choix que l'on effectue pour U
, C
et V
sera le suivant:
C
: on choisit cette matrice égale à la matrice identité. La taille de cette matrice: le nombre de lignes non nulles de la matrice B - A
.
V
: on choisit de stocker dans cette matrice les lignes non nulles de la matrice B - A
U
: on met une:
- ligne de 0 dans la ligne i si la ligne i correspondante de la matrice B - A
contient une ligne de 0
- ligne de 0 dans la ligne i et un 1 dans la colonne j pour mettre la jieme ligne de la matrice V
dans la matrice B - A
.
Appliquons ces règles à notre matrice B - A
. Notre matrice a 2 lignes non nulles. C sera une matrice identité carrée de dimension 2 (c'est notre choix).
La matrice V
sera la suivante:
V = [1 1 1 1; 2 2 2 2];
La matrice U
sera la suivante:
U = [0 0; 1 0; 0 0; 0 1];
Calculons maintenant le produit U.C.V
:
U.C.V = [0 0; 1 0; 0 0; 0 1] . [1 0; 0 1] . [1 1 1 1; 2 2 2 2];
U.C.V = [0 0; 1 0; 0 0; 0 1] . [1 1 1 1; 2 2 2 2];
U.C.V = [0 0 0 0; 1 1 1 1; 0 0 0 0; 2 2 2 2];
On ajoute A
:
A + U.C.V = [1 2 3 4; 6 7 8 9; 9 10 11 12; 15 16 17 18] == B
Quelques détails concernant le calcule de la formule de Woodbury:
(A + U.C.V)^-1 = A^-1 - A^-1.U.(C^-1 + V.A^-1.U)^-1.V.A^-1
On connait A^-1
.
On va stocker V.A^-1
dans la variable temporaire tmp
:
tmp = V.A^-1;
La formule simplifiée s'écrit:
B^-1 = (A + U.C.V)^-1 = A^-1 - A^-1.U.(C^-1 + tmp.U)^-1.tmp;
On ajoute quelques parenthèses pour s'assurer de l'ordre des opérations matricielles:
B^-1 = (A + U.C.V)^-1 = A^-1 - (A^-1.U).((C^-1 + tmp.U)^-1.tmp);