zbdsqr


NAME

zbdsqr - compute the singular value decomposition (SVD) of a real N-by-N (upper or lower) bidiagonal matrix B.


SYNOPSIS

  SUBROUTINE ZBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, 
 *      C, LDC, WORK, INFO)
  CHARACTER * 1 UPLO
  DOUBLE COMPLEX VT(LDVT,*), U(LDU,*), C(LDC,*)
  INTEGER N, NCVT, NRU, NCC, LDVT, LDU, LDC, INFO
  DOUBLE PRECISION D(*), E(*), WORK(*)
 
  SUBROUTINE ZBDSQR_64( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, 
 *      LDU, C, LDC, WORK, INFO)
  CHARACTER * 1 UPLO
  DOUBLE COMPLEX VT(LDVT,*), U(LDU,*), C(LDC,*)
  INTEGER*8 N, NCVT, NRU, NCC, LDVT, LDU, LDC, INFO
  DOUBLE PRECISION D(*), E(*), WORK(*)
 

F95 INTERFACE

  SUBROUTINE BDSQR( UPLO, [N], [NCVT], [NRU], [NCC], D, E, VT, [LDVT], 
 *       U, [LDU], C, [LDC], [WORK], [INFO])
  CHARACTER(LEN=1) :: UPLO
  COMPLEX(8), DIMENSION(:,:) :: VT, U, C
  INTEGER :: N, NCVT, NRU, NCC, LDVT, LDU, LDC, INFO
  REAL(8), DIMENSION(:) :: D, E, WORK
 
  SUBROUTINE BDSQR_64( UPLO, [N], [NCVT], [NRU], [NCC], D, E, VT, 
 *       [LDVT], U, [LDU], C, [LDC], [WORK], [INFO])
  CHARACTER(LEN=1) :: UPLO
  COMPLEX(8), DIMENSION(:,:) :: VT, U, C
  INTEGER(8) :: N, NCVT, NRU, NCC, LDVT, LDU, LDC, INFO
  REAL(8), DIMENSION(:) :: D, E, WORK
 

C INTERFACE

#include <sunperf.h>

void zbdsqr(char uplo, int n, int ncvt, int nru, int ncc, double *d, double *e, doublecomplex *vt, int ldvt, doublecomplex *u, int ldu, doublecomplex *c, int ldc, int *info);

void zbdsqr_64(char uplo, long n, long ncvt, long nru, long ncc, double *d, double *e, doublecomplex *vt, long ldvt, doublecomplex *u, long ldu, doublecomplex *c, long ldc, long *info);


PURPOSE

zbdsqr computes the singular value decomposition (SVD) of a real N-by-N (upper or lower) bidiagonal matrix B: B = Q * S * P' (P' denotes the transpose of P), where S is a diagonal matrix with non-negative diagonal elements (the singular values of B), and Q and P are orthogonal matrices.

The routine computes S, and optionally computes U * Q, P' * VT, or Q' * C, for given complex input matrices U, VT, and C.

See "Computing Small Singular Values of Bidiagonal Matrices With Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11, no. 5, pp. 873-912, Sept 1990) and

``Accurate singular values and differential qd algorithms,'' by B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics Department, University of California at Berkeley, July 1992 for a detailed description of the algorithm.


ARGUMENTS

* UPLO (input)
* N (input)
The order of the matrix B. N >= 0.

* NCVT (input)
The number of columns of the matrix VT. NCVT >= 0.

* NRU (input)
The number of rows of the matrix U. NRU >= 0.

* NCC (input)
The number of columns of the matrix C. NCC >= 0.

* D (input/output)
On entry, the n diagonal elements of the bidiagonal matrix B. On exit, if INFO=0, the singular values of B in decreasing order.

* E (input/output)
On entry, the elements of E contain the offdiagonal elements of of the bidiagonal matrix whose SVD is desired. On normal exit (INFO = 0), E is destroyed. If the algorithm does not converge (INFO > 0), D and E will contain the diagonal and superdiagonal elements of a bidiagonal matrix orthogonally equivalent to the one given as input. E(N) is used for workspace.

* VT (input/output)
On entry, an N-by-NCVT matrix VT. On exit, VT is overwritten by P' * VT. VT is not referenced if NCVT = 0.

* LDVT (input)
The leading dimension of the array VT. LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0.

* U (input/output)
On entry, an NRU-by-N matrix U. On exit, U is overwritten by U * Q. U is not referenced if NRU = 0.

* LDU (input)
The leading dimension of the array U. LDU >= max(1,NRU).

* C (input/output)
On entry, an N-by-NCC matrix C. On exit, C is overwritten by Q' * C. C is not referenced if NCC = 0.

* LDC (input)
The leading dimension of the array C. LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0.

* WORK (workspace)
* INFO (output)