Décomposition en valeurs singulières (SVD) d’une matrice 2×2

Cette page détaille la décomposition en valeurs singulières (SVD) d’une matrice 2X2. Nous rappelons :

$$ A=\left[ \begin{matrix} a & b \\ c & d \end{matrix} \right]=U \cdot \Sigma \cdot V^T $$

où \(U\) et \(V\) sont orthogonales et \(\Sigma\) est une matrice diagonale contenant les valeurs singulières. Dans le cas particulier d’une matrice 2×2 la décomposition est donnée par :

$$ A= \left[ \begin{matrix} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta) \end{matrix} \right] \cdot \left[ \begin{matrix} \sigma_1 & 0 \\ 0 & \sigma_2 \end{matrix} \right] \cdot \left[ \begin{matrix} cos(\phi) & -sin(\phi) \\ sin(\phi) & cos(\phi) \end{matrix} \right] $$

avec :

$$ \begin{matrix} V=C \cdot W=\left[ \begin{matrix} \pm{1} & 0 \\ 0 & \pm{1} \end{matrix} \right] \end{matrix} $$

Calcul de \(U\)

\( \theta \) est donné par : $$ \theta=\frac{1}{2} atan2 (2ac+2bd , a^2+b^2-c^2-d^2) $$

La matrice \(U\) est donnée par : $$ U=\left[ \begin{matrix} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta) \end{matrix} \right] $$

Calcul de \( \Sigma \)

Les valeurs singulières sont données par :

$$ \begin{matrix} \sigma_1 &=& \sqrt{ \frac {S_1 + S_2}{2} } \\ \sigma_2 &=& \sqrt{ \frac {S_1 - S_2}{2} } \\ \end{matrix} $$

avec :

$$ \begin{matrix} S_1 &=& a^2+b^2+c^2+d^2 \\ S_2 &=& \sqrt{(a^2+b^2-c^2-d^2)^2 + 4(ac+bd)^2 } \end{matrix} $$

La matrice \( \Sigma \) est donnée par : $$ \Sigma=\left[ \begin{matrix} \sigma_1 & 0 \\ 0 & \sigma_2 \end{matrix} \right] $$

Calcul de \( V \)

Commençons par calculer l’angle intermédiaire \( \Phi \) donné par la formule suivante :

$$ \Phi=\frac{1}{2} atan2 (2ab+2cd , a^2-b^2+c^2-d^2) $$

Calculons maintenant les scalaires suivants :

$$ \begin{matrix} s_{11} &=& (a.c_\theta+c.s_\theta).c_\Phi &+& (b.c_\theta+d.s_\theta).s_\Phi \\ s_{22} &=& (a.s_\theta-c.c_\theta).s_\Phi &+& (-b.s_\theta+d.c_\theta).c_\Phi \\ \end{matrix} $$

où :

$$ \begin{matrix} c_\Phi=cos(\Phi) \\ s_\Phi=sin(\Phi) \\ c_\theta=cos(\theta) \\ s_\theta=sin(\theta) \end{matrix} $$

La matrice \(V\) est donnée par :

$$ V=\left[ \begin{matrix} \frac {s_{11}} {|s_{11}|}cos(\Phi) & -\frac {s_{22}} {|s_{22}|}sin(\Phi) \\ \frac {s_{11}} {|s_{11}|} sin(\Phi) & \frac {s_{22}} {|s_{22}|}cos(\Phi) \end{matrix} \right] $$

Notons que \( \frac {s_{11}} {|s_{11}|} \) et \( \frac {s_{22}} {|s_{22}|} \) sont respectivement les signes de \( s_{11}\) et \(s_{22}\). Sous Matlab, l’utilisation de la fonction sign évite le problème de la division par zéro dans les cas où \(s_{11}\) et/ou \(s_{22}\) sont nuls.

Fonction Matlab

%% Matlab function for computing the SVD of a 2x2 matrix
%% Written by Randy Ellis
%% More information at: http://www.lucidar.me

function [U,SIG,V] = svd2x2(A)
% [U,SIG,V] = svd2x2(A) finds the SVD of 2x2 matrix A
% where U and V are orthogonal, SIG is diagonal,
% and A=U*SIG*V’
% Find U such that U*A*A’*U’=diag
Su = A*A';
phi = 0.5*atan2(Su(1,2)+Su(2,1), Su(1,1)-Su(2,2));
Cphi = cos(phi);
Sphi = sin(phi);
U = [Cphi -Sphi ; Sphi Cphi];

% Find W such that W’*A’*A*W=diag
Sw = A'*A;
theta = 0.5*atan2(Sw(1,2)+Sw(2,1), Sw(1,1)-Sw(2,2));
Ctheta = cos(theta);
Stheta = sin(theta);
W = [Ctheta, -Stheta ; Stheta, Ctheta];

% Find the singular values from U
SUsum= Su(1,1)+Su(2,2);
SUdif= sqrt((Su(1,1)-Su(2,2))^2 + 4*Su(1,2)*Su(2,1));
svals= [sqrt((SUsum+SUdif)/2) sqrt((SUsum-SUdif)/2)];
SIG =diag(svals);

% Find the correction matrix for the right side
S = U'*A*W
C = diag([sign(S(1,1)) sign(S(2,2))]);
V = W*C;

Téléchargement

Les scripts d'exemple pour Matlab peuvent être téléchargés ci-dessous :

svd_2x2.zip

Crédits: cette page s'appuie sur le rapport de Randy Ellis : Singular Value Decomposition of a 2x2 Matrix.

Voir aussi


Dernière mise à jour : 11/06/2018