NAME

zgesdd - compute the singular value decomposition (SVD) of a complex M-by-N matrix A, optionally computing the left and/or right singular vectors, by using divide-and-conquer method


SYNOPSIS

  SUBROUTINE ZGESDD( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, 
 *      LWORK, RWORK, IWORK, INFO)
  CHARACTER * 1 JOBZ
  DOUBLE COMPLEX A(LDA,*), U(LDU,*), VT(LDVT,*), WORK(*)
  INTEGER M, N, LDA, LDU, LDVT, LWORK, INFO
  INTEGER IWORK(*)
  DOUBLE PRECISION S(*), RWORK(*)
  SUBROUTINE ZGESDD_64( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, 
 *      LWORK, RWORK, IWORK, INFO)
  CHARACTER * 1 JOBZ
  DOUBLE COMPLEX A(LDA,*), U(LDU,*), VT(LDVT,*), WORK(*)
  INTEGER*8 M, N, LDA, LDU, LDVT, LWORK, INFO
  INTEGER*8 IWORK(*)
  DOUBLE PRECISION S(*), RWORK(*)

F95 INTERFACE

  SUBROUTINE GESDD( JOBZ, [M], [N], A, [LDA], S, U, [LDU], VT, [LDVT], 
 *       [WORK], [LWORK], [RWORK], [IWORK], [INFO])
  CHARACTER(LEN=1) :: JOBZ
  COMPLEX(8), DIMENSION(:) :: WORK
  COMPLEX(8), DIMENSION(:,:) :: A, U, VT
  INTEGER :: M, N, LDA, LDU, LDVT, LWORK, INFO
  INTEGER, DIMENSION(:) :: IWORK
  REAL(8), DIMENSION(:) :: S, RWORK
  SUBROUTINE GESDD_64( JOBZ, [M], [N], A, [LDA], S, U, [LDU], VT, 
 *       [LDVT], [WORK], [LWORK], [RWORK], [IWORK], [INFO])
  CHARACTER(LEN=1) :: JOBZ
  COMPLEX(8), DIMENSION(:) :: WORK
  COMPLEX(8), DIMENSION(:,:) :: A, U, VT
  INTEGER(8) :: M, N, LDA, LDU, LDVT, LWORK, INFO
  INTEGER(8), DIMENSION(:) :: IWORK
  REAL(8), DIMENSION(:) :: S, RWORK

C INTERFACE

#include <sunperf.h>

void zgesdd(char jobz, int m, int n, doublecomplex *a, int lda, double *s, doublecomplex *u, int ldu, doublecomplex *vt, int ldvt, int *info);

void zgesdd_64(char jobz, long m, long n, doublecomplex *a, long lda, double *s, doublecomplex *u, long ldu, doublecomplex *vt, long ldvt, long *info);


PURPOSE

zgesdd computes the singular value decomposition (SVD) of a complex M-by-N matrix A, optionally computing the left and/or right singular vectors, by using divide-and-conquer method. The SVD is written = U * SIGMA * conjugate-transpose(V)

where SIGMA is an M-by-N matrix which is zero except for its min(m,n) diagonal elements, U is an M-by-M unitary matrix, and V is an N-by-N unitary matrix. The diagonal elements of SIGMA are the singular values of A; they are real and non-negative, and are returned in descending order. The first min(m,n) columns of U and V are the left and right singular vectors of A.

Note that the routine returns VT = V**H, not V.

The divide and conquer algorithm makes very mild assumptions about floating point arithmetic. It will work on machines with a guard digit in add/subtract, or on those binary machines without guard digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. It could conceivably fail on hexadecimal or decimal machines without guard digits, but we know of none.


ARGUMENTS


FURTHER DETAILS

Based on contributions by

   Ming Gu and Huan Ren, Computer Science Division, University of
   California at Berkeley, USA