LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
|
recursive subroutine dorcsd | ( | character | jobu1, |
character | jobu2, | ||
character | jobv1t, | ||
character | jobv2t, | ||
character | trans, | ||
character | signs, | ||
integer | m, | ||
integer | p, | ||
integer | q, | ||
double precision, dimension( ldx11, * ) | x11, | ||
integer | ldx11, | ||
double precision, dimension( ldx12, * ) | x12, | ||
integer | ldx12, | ||
double precision, dimension( ldx21, * ) | x21, | ||
integer | ldx21, | ||
double precision, dimension( ldx22, * ) | x22, | ||
integer | ldx22, | ||
double precision, dimension( * ) | theta, | ||
double precision, dimension( ldu1, * ) | u1, | ||
integer | ldu1, | ||
double precision, dimension( ldu2, * ) | u2, | ||
integer | ldu2, | ||
double precision, dimension( ldv1t, * ) | v1t, | ||
integer | ldv1t, | ||
double precision, dimension( ldv2t, * ) | v2t, | ||
integer | ldv2t, | ||
double precision, dimension( * ) | work, | ||
integer | lwork, | ||
integer, dimension( * ) | iwork, | ||
integer | info ) |
DORCSD
Download DORCSD + dependencies [TGZ] [ZIP] [TXT]
!> !> DORCSD computes the CS decomposition of an M-by-M partitioned !> orthogonal matrix X: !> !> [ I 0 0 | 0 0 0 ] !> [ 0 C 0 | 0 -S 0 ] !> [ X11 | X12 ] [ U1 | ] [ 0 0 0 | 0 0 -I ] [ V1 | ]**T !> X = [-----------] = [---------] [---------------------] [---------] . !> [ X21 | X22 ] [ | U2 ] [ 0 0 0 | I 0 0 ] [ | V2 ] !> [ 0 S 0 | 0 C 0 ] !> [ 0 0 I | 0 0 0 ] !> !> X11 is P-by-Q. The orthogonal matrices U1, U2, V1, and V2 are P-by-P, !> (M-P)-by-(M-P), Q-by-Q, and (M-Q)-by-(M-Q), respectively. C and S are !> R-by-R nonnegative diagonal matrices satisfying C^2 + S^2 = I, in !> which R = MIN(P,M-P,Q,M-Q). !>
[in] | JOBU1 | !> JOBU1 is CHARACTER !> = 'Y': U1 is computed; !> otherwise: U1 is not computed. !> |
[in] | JOBU2 | !> JOBU2 is CHARACTER !> = 'Y': U2 is computed; !> otherwise: U2 is not computed. !> |
[in] | JOBV1T | !> JOBV1T is CHARACTER !> = 'Y': V1T is computed; !> otherwise: V1T is not computed. !> |
[in] | JOBV2T | !> JOBV2T is CHARACTER !> = 'Y': V2T is computed; !> otherwise: V2T is not computed. !> |
[in] | TRANS | !> TRANS is CHARACTER !> = 'T': X, U1, U2, V1T, and V2T are stored in row-major !> order; !> otherwise: X, U1, U2, V1T, and V2T are stored in column- !> major order. !> |
[in] | SIGNS | !> SIGNS is CHARACTER !> = 'O': The lower-left block is made nonpositive (the !> convention); !> otherwise: The upper-right block is made nonpositive (the !> convention). !> |
[in] | M | !> M is INTEGER !> The number of rows and columns in X. !> |
[in] | P | !> P is INTEGER !> The number of rows in X11 and X12. 0 <= P <= M. !> |
[in] | Q | !> Q is INTEGER !> The number of columns in X11 and X21. 0 <= Q <= M. !> |
[in,out] | X11 | !> X11 is DOUBLE PRECISION array, dimension (LDX11,Q) !> On entry, part of the orthogonal matrix whose CSD is desired. !> |
[in] | LDX11 | !> LDX11 is INTEGER !> The leading dimension of X11. LDX11 >= MAX(1,P). !> |
[in,out] | X12 | !> X12 is DOUBLE PRECISION array, dimension (LDX12,M-Q) !> On entry, part of the orthogonal matrix whose CSD is desired. !> |
[in] | LDX12 | !> LDX12 is INTEGER !> The leading dimension of X12. LDX12 >= MAX(1,P). !> |
[in,out] | X21 | !> X21 is DOUBLE PRECISION array, dimension (LDX21,Q) !> On entry, part of the orthogonal matrix whose CSD is desired. !> |
[in] | LDX21 | !> LDX21 is INTEGER !> The leading dimension of X11. LDX21 >= MAX(1,M-P). !> |
[in,out] | X22 | !> X22 is DOUBLE PRECISION array, dimension (LDX22,M-Q) !> On entry, part of the orthogonal matrix whose CSD is desired. !> |
[in] | LDX22 | !> LDX22 is INTEGER !> The leading dimension of X11. LDX22 >= MAX(1,M-P). !> |
[out] | THETA | !> THETA is DOUBLE PRECISION array, dimension (R), in which R = !> MIN(P,M-P,Q,M-Q). !> C = DIAG( COS(THETA(1)), ... , COS(THETA(R)) ) and !> S = DIAG( SIN(THETA(1)), ... , SIN(THETA(R)) ). !> |
[out] | U1 | !> U1 is DOUBLE PRECISION array, dimension (LDU1,P) !> If JOBU1 = 'Y', U1 contains the P-by-P orthogonal matrix U1. !> |
[in] | LDU1 | !> LDU1 is INTEGER !> The leading dimension of U1. If JOBU1 = 'Y', LDU1 >= !> MAX(1,P). !> |
[out] | U2 | !> U2 is DOUBLE PRECISION array, dimension (LDU2,M-P) !> If JOBU2 = 'Y', U2 contains the (M-P)-by-(M-P) orthogonal !> matrix U2. !> |
[in] | LDU2 | !> LDU2 is INTEGER !> The leading dimension of U2. If JOBU2 = 'Y', LDU2 >= !> MAX(1,M-P). !> |
[out] | V1T | !> V1T is DOUBLE PRECISION array, dimension (LDV1T,Q) !> If JOBV1T = 'Y', V1T contains the Q-by-Q matrix orthogonal !> matrix V1**T. !> |
[in] | LDV1T | !> LDV1T is INTEGER !> The leading dimension of V1T. If JOBV1T = 'Y', LDV1T >= !> MAX(1,Q). !> |
[out] | V2T | !> V2T is DOUBLE PRECISION array, dimension (LDV2T,M-Q) !> If JOBV2T = 'Y', V2T contains the (M-Q)-by-(M-Q) orthogonal !> matrix V2**T. !> |
[in] | LDV2T | !> LDV2T is INTEGER !> The leading dimension of V2T. If JOBV2T = 'Y', LDV2T >= !> MAX(1,M-Q). !> |
[out] | WORK | !> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) !> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. !> If INFO > 0 on exit, WORK(2:R) contains the values PHI(1), !> ..., PHI(R-1) that, together with THETA(1), ..., THETA(R), !> define the matrix in intermediate bidiagonal-block form !> remaining after nonconvergence. INFO specifies the number !> of nonzero PHI's. !> |
[in] | LWORK | !> LWORK is INTEGER !> The dimension of the array WORK. !> !> If LWORK = -1, then a workspace query is assumed; the routine !> only calculates the optimal size of the WORK array, returns !> this value as the first entry of the work array, and no error !> message related to LWORK is issued by XERBLA. !> |
[out] | IWORK | !> IWORK is INTEGER array, dimension (M-MIN(P, M-P, Q, M-Q)) !> |
[out] | INFO | !> INFO is INTEGER !> = 0: successful exit. !> < 0: if INFO = -i, the i-th argument had an illegal value. !> > 0: DBBCSD did not converge. See the description of WORK !> above for details. !> |
Definition at line 293 of file dorcsd.f.