uncsd#
Functions
-
void cuncsd(const char *jobu1, const char *jobu2, const char *jobv1t, const char *jobv2t, const char *trans, const char *signs, const INT m, const INT p, const INT q, c64 *X11, const INT ldx11, c64 *X12, const INT ldx12, c64 *X21, const INT ldx21, c64 *X22, const INT ldx22, f32 *restrict theta, c64 *restrict U1, const INT ldu1, c64 *restrict U2, const INT ldu2, c64 *restrict V1T, const INT ldv1t, c64 *restrict V2T, const INT ldv2t, c64 *restrict work, const INT lwork, f32 *restrict rwork, const INT lrwork, INT *restrict iwork, INT *info)#
CUNCSD computes the CS decomposition of an M-by-M partitioned unitary matrix X:
X = [——–—] = [———] [———————] [———] . [ X21 | X22 ] [ | U2 ] [ 0 0 0 | I 0 0 ] [ | V2 ] [ 0 S 0 | 0 C 0 ] [ 0 0 I | 0 0 0 ][ I 0 0 | 0 0 0 ] [ 0 C 0 | 0 -S 0 ] [ X11 | X12 ] [ U1 | ] [ 0 0 0 | 0 0 -I ] [ V1 | ]**H
X11 is P-by-Q. The unitary 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).
Parameters
injobu1= ‘Y’: U1 is computed; otherwise: U1 is not computed.
injobu2= ‘Y’: U2 is computed; otherwise: U2 is not computed.
injobv1t= ‘Y’: V1T is computed; otherwise: V1T is not computed.
injobv2t= ‘Y’: V2T is computed; otherwise: V2T is not computed.
intrans= ‘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.
insigns= ‘O’: The lower-left block is made nonpositive (“other” convention); otherwise: The upper-right block is made nonpositive (“default” convention).
inmThe number of rows and columns in X.
inpThe number of rows in X11 and X12. 0 <= p <= m.
inqThe number of columns in X11 and X21. 0 <= q <= m.
inoutX11Complex*16 array, dimension (ldx11, q). On entry, part of the unitary matrix whose CSD is desired.
inldx11The leading dimension of X11.
inoutX12Complex*16 array, dimension (ldx12, m-q). On entry, part of the unitary matrix whose CSD is desired.
inldx12The leading dimension of X12.
inoutX21Complex*16 array, dimension (ldx21, q). On entry, part of the unitary matrix whose CSD is desired.
inldx21The leading dimension of X21.
inoutX22Complex*16 array, dimension (ldx22, m-q). On entry, part of the unitary matrix whose CSD is desired.
inldx22The leading dimension of X22.
outthetaSingle precision array, dimension (r), where 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)) ).
outU1If jobu1 = ‘Y’, U1 contains the P-by-P unitary matrix U1.
inldu1The leading dimension of U1.
outU2If jobu2 = ‘Y’, U2 contains the (M-P)-by-(M-P) unitary matrix U2.
inldu2The leading dimension of U2.
outV1TIf jobv1t = ‘Y’, V1T contains the Q-by-Q unitary matrix V1**H.
inldv1tThe leading dimension of V1T.
outV2TIf jobv2t = ‘Y’, V2T contains the (M-Q)-by-(M-Q) unitary matrix V2**H.
inldv2tThe leading dimension of V2T.
outworkComplex*16 array, dimension (max(1, lwork)). On exit, if info = 0, work[0] returns the optimal lwork.
inlworkThe dimension of the array work. If lwork = -1, a workspace query is assumed.
outrworkSingle precision array, dimension (max(1, lrwork)). On exit, if info = 0, rwork[0] returns the optimal lrwork.
inlrworkThe dimension of the array rwork. If lrwork = -1, a workspace query is assumed.
outiworkInteger array, dimension (m - min(p, m-p, q, m-q)).
outinfo= 0: successful exit.
< 0: if info = -i, the i-th argument had an illegal value.
> 0: CBBCSD did not converge.
void cuncsd(
const char* jobu1,
const char* jobu2,
const char* jobv1t,
const char* jobv2t,
const char* trans,
const char* signs,
const INT m,
const INT p,
const INT q,
c64* X11,
const INT ldx11,
c64* X12,
const INT ldx12,
c64* X21,
const INT ldx21,
c64* X22,
const INT ldx22,
f32* restrict theta,
c64* restrict U1,
const INT ldu1,
c64* restrict U2,
const INT ldu2,
c64* restrict V1T,
const INT ldv1t,
c64* restrict V2T,
const INT ldv2t,
c64* restrict work,
const INT lwork,
f32* restrict rwork,
const INT lrwork,
INT* restrict iwork,
INT* info
);
Functions
-
void zuncsd(const char *jobu1, const char *jobu2, const char *jobv1t, const char *jobv2t, const char *trans, const char *signs, const INT m, const INT p, const INT q, c128 *X11, const INT ldx11, c128 *X12, const INT ldx12, c128 *X21, const INT ldx21, c128 *X22, const INT ldx22, f64 *restrict theta, c128 *restrict U1, const INT ldu1, c128 *restrict U2, const INT ldu2, c128 *restrict V1T, const INT ldv1t, c128 *restrict V2T, const INT ldv2t, c128 *restrict work, const INT lwork, f64 *restrict rwork, const INT lrwork, INT *restrict iwork, INT *info)#
ZUNCSD computes the CS decomposition of an M-by-M partitioned unitary matrix X:
X = [——–—] = [———] [———————] [———] . [ X21 | X22 ] [ | U2 ] [ 0 0 0 | I 0 0 ] [ | V2 ] [ 0 S 0 | 0 C 0 ] [ 0 0 I | 0 0 0 ][ I 0 0 | 0 0 0 ] [ 0 C 0 | 0 -S 0 ] [ X11 | X12 ] [ U1 | ] [ 0 0 0 | 0 0 -I ] [ V1 | ]**H
X11 is P-by-Q. The unitary 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).
Parameters
injobu1= ‘Y’: U1 is computed; otherwise: U1 is not computed.
injobu2= ‘Y’: U2 is computed; otherwise: U2 is not computed.
injobv1t= ‘Y’: V1T is computed; otherwise: V1T is not computed.
injobv2t= ‘Y’: V2T is computed; otherwise: V2T is not computed.
intrans= ‘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.
insigns= ‘O’: The lower-left block is made nonpositive (“other” convention); otherwise: The upper-right block is made nonpositive (“default” convention).
inmThe number of rows and columns in X.
inpThe number of rows in X11 and X12. 0 <= p <= m.
inqThe number of columns in X11 and X21. 0 <= q <= m.
inoutX11Complex*16 array, dimension (ldx11, q). On entry, part of the unitary matrix whose CSD is desired.
inldx11The leading dimension of X11.
inoutX12Complex*16 array, dimension (ldx12, m-q). On entry, part of the unitary matrix whose CSD is desired.
inldx12The leading dimension of X12.
inoutX21Complex*16 array, dimension (ldx21, q). On entry, part of the unitary matrix whose CSD is desired.
inldx21The leading dimension of X21.
inoutX22Complex*16 array, dimension (ldx22, m-q). On entry, part of the unitary matrix whose CSD is desired.
inldx22The leading dimension of X22.
outthetaDouble precision array, dimension (r), where 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)) ).
outU1If jobu1 = ‘Y’, U1 contains the P-by-P unitary matrix U1.
inldu1The leading dimension of U1.
outU2If jobu2 = ‘Y’, U2 contains the (M-P)-by-(M-P) unitary matrix U2.
inldu2The leading dimension of U2.
outV1TIf jobv1t = ‘Y’, V1T contains the Q-by-Q unitary matrix V1**H.
inldv1tThe leading dimension of V1T.
outV2TIf jobv2t = ‘Y’, V2T contains the (M-Q)-by-(M-Q) unitary matrix V2**H.
inldv2tThe leading dimension of V2T.
outworkComplex*16 array, dimension (max(1, lwork)). On exit, if info = 0, work[0] returns the optimal lwork.
inlworkThe dimension of the array work. If lwork = -1, a workspace query is assumed.
outrworkDouble precision array, dimension (max(1, lrwork)). On exit, if info = 0, rwork[0] returns the optimal lrwork.
inlrworkThe dimension of the array rwork. If lrwork = -1, a workspace query is assumed.
outiworkInteger array, dimension (m - min(p, m-p, q, m-q)).
outinfo= 0: successful exit.
< 0: if info = -i, the i-th argument had an illegal value.
> 0: ZBBCSD did not converge.
void zuncsd(
const char* jobu1,
const char* jobu2,
const char* jobv1t,
const char* jobv2t,
const char* trans,
const char* signs,
const INT m,
const INT p,
const INT q,
c128* X11,
const INT ldx11,
c128* X12,
const INT ldx12,
c128* X21,
const INT ldx21,
c128* X22,
const INT ldx22,
f64* restrict theta,
c128* restrict U1,
const INT ldu1,
c128* restrict U2,
const INT ldu2,
c128* restrict V1T,
const INT ldv1t,
c128* restrict V2T,
const INT ldv2t,
c128* restrict work,
const INT lwork,
f64* restrict rwork,
const INT lrwork,
INT* restrict iwork,
INT* info
);