La deuxième étape de la mise sous forme SVD consiste à appliquer un certain nombre de fois la décomposition $QR$ sur une matrice bidiagonale. Concrètement :
U = Id; V = Id; S = BD;
For i from 0 to NMax
(Q1, R1) = decomp_qr(matrix_transpose(S))
(Q2, R2) = decomp_qr(matrix_transpose(R1))
S = R2;
U = U * Q2;
V = matrix_transpose(Q1) * V
End for
Return (U,S,V)
Dans cet algorithme, la matrice $S$ converge vers une matrice diagonale, et les matrices ($U$,$S$,$V$) correspondent aux matrices de la décomposition SVD.
numpy.linalg.qr
.Les appels à la fonction de décomposition $QR$ dans cet algorithme sont en fait disproportionnés : les matrices sur lesquelles on applique cet algorithme sont beaucoup plus simples que des matrices pleines.
Usuellement, la décomposition SVD demande à ce que les éléments de la matrice $S$ soient positifs, ordonnés de manière décroissante.