orcsd#
Functions
-
void sorcsd(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, f32 *restrict X11, const INT ldx11, f32 *restrict X12, const INT ldx12, f32 *restrict X21, const INT ldx21, f32 *restrict X22, const INT ldx22, f32 *restrict theta, f32 *restrict U1, const INT ldu1, f32 *restrict U2, const INT ldu2, f32 *restrict V1T, const INT ldv1t, f32 *restrict V2T, const INT ldv2t, f32 *restrict work, const INT lwork, INT *restrict iwork, INT *info)#
SORCSD computes the CS decomposition of an M-by-M partitioned orthogonal 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 | ]**T
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).
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.
inoutX11Double precision array, dimension (ldx11, q). On entry, part of the orthogonal matrix whose CSD is desired.
inldx11The leading dimension of X11. ldx11 >= max(1, p) (column-major) or ldx11 >= max(1, q) (row-major).
inoutX12Double precision array, dimension (ldx12, m-q). On entry, part of the orthogonal matrix whose CSD is desired.
inldx12The leading dimension of X12.
inoutX21Double precision array, dimension (ldx21, q). On entry, part of the orthogonal matrix whose CSD is desired.
inldx21The leading dimension of X21.
inoutX22Double precision array, dimension (ldx22, m-q). On entry, part of the orthogonal 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 orthogonal matrix U1.
inldu1The leading dimension of U1.
outU2If jobu2 = ‘Y’, U2 contains the (M-P)-by-(M-P) orthogonal matrix U2.
inldu2The leading dimension of U2.
outV1TIf jobv1t = ‘Y’, V1T contains the Q-by-Q orthogonal matrix V1**T.
inldv1tThe leading dimension of V1T.
outV2TIf jobv2t = ‘Y’, V2T contains the (M-Q)-by-(M-Q) orthogonal matrix V2**T.
inldv2tThe leading dimension of V2T.
outworkDouble precision 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.
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: SBBCSD did not converge.
void sorcsd(
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,
f32* restrict X11,
const INT ldx11,
f32* restrict X12,
const INT ldx12,
f32* restrict X21,
const INT ldx21,
f32* restrict X22,
const INT ldx22,
f32* restrict theta,
f32* restrict U1,
const INT ldu1,
f32* restrict U2,
const INT ldu2,
f32* restrict V1T,
const INT ldv1t,
f32* restrict V2T,
const INT ldv2t,
f32* restrict work,
const INT lwork,
INT* restrict iwork,
INT* info
);
Functions
-
void dorcsd(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, f64 *restrict X11, const INT ldx11, f64 *restrict X12, const INT ldx12, f64 *restrict X21, const INT ldx21, f64 *restrict X22, const INT ldx22, f64 *restrict theta, f64 *restrict U1, const INT ldu1, f64 *restrict U2, const INT ldu2, f64 *restrict V1T, const INT ldv1t, f64 *restrict V2T, const INT ldv2t, f64 *restrict work, const INT lwork, INT *restrict iwork, INT *info)#
DORCSD computes the CS decomposition of an M-by-M partitioned orthogonal 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 | ]**T
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).
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.
inoutX11Double precision array, dimension (ldx11, q). On entry, part of the orthogonal matrix whose CSD is desired.
inldx11The leading dimension of X11. ldx11 >= max(1, p) (column-major) or ldx11 >= max(1, q) (row-major).
inoutX12Double precision array, dimension (ldx12, m-q). On entry, part of the orthogonal matrix whose CSD is desired.
inldx12The leading dimension of X12.
inoutX21Double precision array, dimension (ldx21, q). On entry, part of the orthogonal matrix whose CSD is desired.
inldx21The leading dimension of X21.
inoutX22Double precision array, dimension (ldx22, m-q). On entry, part of the orthogonal 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 orthogonal matrix U1.
inldu1The leading dimension of U1.
outU2If jobu2 = ‘Y’, U2 contains the (M-P)-by-(M-P) orthogonal matrix U2.
inldu2The leading dimension of U2.
outV1TIf jobv1t = ‘Y’, V1T contains the Q-by-Q orthogonal matrix V1**T.
inldv1tThe leading dimension of V1T.
outV2TIf jobv2t = ‘Y’, V2T contains the (M-Q)-by-(M-Q) orthogonal matrix V2**T.
inldv2tThe leading dimension of V2T.
outworkDouble precision 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.
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: DBBCSD did not converge.
void dorcsd(
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,
f64* restrict X11,
const INT ldx11,
f64* restrict X12,
const INT ldx12,
f64* restrict X21,
const INT ldx21,
f64* restrict X22,
const INT ldx22,
f64* restrict theta,
f64* restrict U1,
const INT ldu1,
f64* restrict U2,
const INT ldu2,
f64* restrict V1T,
const INT ldv1t,
f64* restrict V2T,
const INT ldv2t,
f64* restrict work,
const INT lwork,
INT* restrict iwork,
INT* info
);