## Bidiagonalization

A general matrix @math{A} can be factorized by similarity transformations into the form,

where @math{U} and @math{V} are orthogonal matrices and @math{B} is a @math{N}-by-@math{N} bidiagonal matrix with non-zero entries only on the diagonal and superdiagonal. The size of U is @math{M}-by-@math{N} and the size of V is @math{N}-by-@math{N}.

Function: int gsl_linalg_bidiag_decomp (gsl_matrix * A, gsl_vector * tau_U, gsl_vector * tau_V)
This function factorizes the @math{M}-by-@math{N} matrix A into bidiagonal form @math{U B V^T}. The diagonal and superdiagonal of the matrix @math{B} are stored in the diagonal and superdiagonal of A. The orthogonal matrices @math{U} and V are stored as compressed Householder vectors in the remaining elements of A. The Householder coefficients are stored in the vectors tau_U and tau_V. The length of tau_U must equal the number of elements in the diagonal of A and the length of tau_V should be one element shorter.

Function: int gsl_linalg_bidiag_unpack (const gsl_matrix * A, const gsl_vector * tau_U, gsl_matrix * U, const gsl_vector * tau_V, gsl_matrix * V, gsl_vector * diag, gsl_vector * superdiag)
This function unpacks the bidiagonal decomposition of A given by `gsl_linalg_bidiag_decomp`, (A, tau_U, tau_V) into the separate orthogonal matrices U, V and the diagonal vector diag and superdiagonal superdiag.

Function: int gsl_linalg_bidiag_unpack2 (gsl_matrix * A, gsl_vector * tau_U, gsl_vector * tau_V, gsl_matrix * V)
This function unpacks the bidiagonal decomposition of A given by `gsl_linalg_bidiag_decomp`, (A, tau_U, tau_V) into the separate orthogonal matrices U, V and the diagonal vector diag and superdiagonal superdiag. The matrix U is stored in-place in A.

Function: int gsl_linalg_bidiag_unpack_B (const gsl_matrix * A, gsl_vector * diag, gsl_vector * superdiag)
This function unpacks the diagonal and superdiagonal of the bidiagonal decomposition of A given by `gsl_linalg_bidiag_decomp`, into the diagonal vector diag and superdiagonal vector superdiag.