cgesdd - 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
SUBROUTINE CGESDD( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, * LWORK, RWORK, IWORK, INFO) CHARACTER * 1 JOBZ COMPLEX A(LDA,*), U(LDU,*), VT(LDVT,*), WORK(*) INTEGER M, N, LDA, LDU, LDVT, LWORK, INFO INTEGER IWORK(*) REAL S(*), RWORK(*)
SUBROUTINE CGESDD_64( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, * LWORK, RWORK, IWORK, INFO) CHARACTER * 1 JOBZ COMPLEX A(LDA,*), U(LDU,*), VT(LDVT,*), WORK(*) INTEGER*8 M, N, LDA, LDU, LDVT, LWORK, INFO INTEGER*8 IWORK(*) REAL S(*), RWORK(*)
SUBROUTINE GESDD( JOBZ, [M], [N], A, [LDA], S, U, [LDU], VT, [LDVT], * [WORK], [LWORK], [RWORK], [IWORK], [INFO]) CHARACTER(LEN=1) :: JOBZ COMPLEX, DIMENSION(:) :: WORK COMPLEX, DIMENSION(:,:) :: A, U, VT INTEGER :: M, N, LDA, LDU, LDVT, LWORK, INFO INTEGER, DIMENSION(:) :: IWORK REAL, 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, DIMENSION(:) :: WORK COMPLEX, DIMENSION(:,:) :: A, U, VT INTEGER(8) :: M, N, LDA, LDU, LDVT, LWORK, INFO INTEGER(8), DIMENSION(:) :: IWORK REAL, DIMENSION(:) :: S, RWORK
#include <sunperf.h>
void cgesdd(char jobz, int m, int n, complex *a, int lda, float *s, complex *u, int ldu, complex *vt, int ldvt, int *info);
void cgesdd_64(char jobz, long m, long n, complex *a, long lda, float *s, complex *u, long ldu, complex *vt, long ldvt, long *info);
cgesdd 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.
= 'A': all M columns of U and all N rows of V**H are returned in the arrays U and VT; = 'S': the first min(M,N) columns of U and the first min(M,N) rows of V**H are returned in the arrays U and VT; = 'O': If M > = N, the first N columns of U are overwritten on the array A and all rows of V**H are returned in the array VT; otherwise, all columns of U are returned in the array U and the first M rows of V**H are overwritten in the array VT; = 'N': no columns of U or rows of V**H are computed.
S(i)
> = S(i+1).
min(M,N)
if JOBZ = 'S'.
If JOBZ = 'A' or JOBZ = 'O' and M < N, U contains the M-by-M
unitary matrix U;
if JOBZ = 'S', U contains the first min(M,N)
columns of U
(the left singular vectors, stored columnwise);
if JOBZ = 'O' and M > = N, or JOBZ = 'N', U is not referenced.
min(M,N)
rows of
V**H (the right singular vectors, stored rowwise);
if JOBZ = 'O' and M < N, or JOBZ = 'N', VT is not referenced.
WORK(1)
returns the optimal LWORK.
WORK(1)
returns optimal LWORK.
dimension(8*MIN(M,N))
= 0: successful exit.
< 0: if INFO = -i, the i-th argument had an illegal value.
> 0: The updating process of SBDSDC did not converge.
Based on contributions by
Ming Gu and Huan Ren, Computer Science Division, University of California at Berkeley, USA