Restoring Bidiagonality to a Matrix in SVD Algorithms

129 Views Asked by At

Good Afternoon,

I am implementing the Golub-Reinsch SVD algorithm and am having difficulty with a boundary case

Given a bidiagonal matrix of the form: $$ \begin{bmatrix} b11 & b12 & 0 \\ 0 & 0 & b23 \\ 0 & 0 & b33 \\ \end{bmatrix} $$

A key step in the algorithm is detecting breaks along the diagonal. If this were a 4x4 matrix with the middle diagonal missing one applies givens rotations to zero out the row, decoupling the matrices. What I do not understand is what to do in the circumstance of the matrix describe above. Zeroing the bidiagonal in the second row is no issue: $$ \begin{bmatrix} b11 & b12 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & b33new \\ \end{bmatrix} $$

but then my implementation produces incorrect results upon convergence.

Per the references I am using, one need restore the upper quadrant to bidiagonality i.e: $$ \begin{bmatrix} b11 & b12 & 0 \\ 0 & bnew & 0 \\ 0 & 0 & somethinghere? \\ \end{bmatrix} $$

But am a bit out of my depths. Can someone provide insight or references?

TIA.