orcsd2by1#
Functions
-
void sorcsd2by1(const char *jobu1, const char *jobu2, const char *jobv1t, const INT m, const INT p, const INT q, f32 *restrict X11, const INT ldx11, f32 *restrict X21, const INT ldx21, f32 *restrict theta, f32 *restrict U1, const INT ldu1, f32 *restrict U2, const INT ldu2, f32 *restrict V1T, const INT ldv1t, f32 *restrict work, const INT lwork, INT *restrict iwork, INT *info)#
SORCSD2BY1 computes the CS decomposition of an M-by-Q matrix X with orthonormal columns that has been partitioned into a 2-by-1 block structure:
X11 is P-by-Q. The orthogonal matrices U1, U2, and V1 are P-by-P, (M-P)-by-(M-P), and Q-by-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). I1 is a K1-by-K1 identity matrix and I2 is a K2-by-K2 identity matrix, where K1 = MAX(Q+P-M,0), K2 = MAX(Q-P,0).[ I1 0 0 ] [ 0 C 0 ] [ X11 ] [ U1 | ] [ 0 0 0 ] X = [-----] = [---------] [----------] V1**T . [ X21 ] [ | U2 ] [ 0 0 0 ] [ 0 S 0 ] [ 0 0 I2]
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.
inmThe number of rows in X.
inpThe number of rows in X11. 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).
inoutX21Double precision array, dimension (ldx21, q). On entry, part of the orthogonal matrix whose CSD is desired.
inldx21The leading dimension of X21. ldx21 >= max(1, m-p).
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)) ).
outU1Double precision array, dimension (ldu1, p). If jobu1 = ‘Y’, U1 contains the P-by-P orthogonal matrix U1.
inldu1The leading dimension of U1. If jobu1 = ‘Y’, ldu1 >= max(1, p).
outU2Double precision array, dimension (ldu2, m-p). If jobu2 = ‘Y’, U2 contains the (M-P)-by-(M-P) orthogonal matrix U2.
inldu2The leading dimension of U2. If jobu2 = ‘Y’, ldu2 >= max(1, m-p).
outV1TDouble precision array, dimension (ldv1t, q). If jobv1t = ‘Y’, V1T contains the Q-by-Q orthogonal matrix V1**T.
inldv1tThe leading dimension of V1T. If jobv1t = ‘Y’, ldv1t >= max(1, q).
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 sorcsd2by1(
const char* jobu1,
const char* jobu2,
const char* jobv1t,
const INT m,
const INT p,
const INT q,
f32* restrict X11,
const INT ldx11,
f32* restrict X21,
const INT ldx21,
f32* restrict theta,
f32* restrict U1,
const INT ldu1,
f32* restrict U2,
const INT ldu2,
f32* restrict V1T,
const INT ldv1t,
f32* restrict work,
const INT lwork,
INT* restrict iwork,
INT* info
);
Functions
-
void dorcsd2by1(const char *jobu1, const char *jobu2, const char *jobv1t, const INT m, const INT p, const INT q, f64 *restrict X11, const INT ldx11, f64 *restrict X21, const INT ldx21, f64 *restrict theta, f64 *restrict U1, const INT ldu1, f64 *restrict U2, const INT ldu2, f64 *restrict V1T, const INT ldv1t, f64 *restrict work, const INT lwork, INT *restrict iwork, INT *info)#
DORCSD2BY1 computes the CS decomposition of an M-by-Q matrix X with orthonormal columns that has been partitioned into a 2-by-1 block structure:
X11 is P-by-Q. The orthogonal matrices U1, U2, and V1 are P-by-P, (M-P)-by-(M-P), and Q-by-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). I1 is a K1-by-K1 identity matrix and I2 is a K2-by-K2 identity matrix, where K1 = MAX(Q+P-M,0), K2 = MAX(Q-P,0).[ I1 0 0 ] [ 0 C 0 ] [ X11 ] [ U1 | ] [ 0 0 0 ] X = [-----] = [---------] [----------] V1**T . [ X21 ] [ | U2 ] [ 0 0 0 ] [ 0 S 0 ] [ 0 0 I2]
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.
inmThe number of rows in X.
inpThe number of rows in X11. 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).
inoutX21Double precision array, dimension (ldx21, q). On entry, part of the orthogonal matrix whose CSD is desired.
inldx21The leading dimension of X21. ldx21 >= max(1, m-p).
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)) ).
outU1Double precision array, dimension (ldu1, p). If jobu1 = ‘Y’, U1 contains the P-by-P orthogonal matrix U1.
inldu1The leading dimension of U1. If jobu1 = ‘Y’, ldu1 >= max(1, p).
outU2Double precision array, dimension (ldu2, m-p). If jobu2 = ‘Y’, U2 contains the (M-P)-by-(M-P) orthogonal matrix U2.
inldu2The leading dimension of U2. If jobu2 = ‘Y’, ldu2 >= max(1, m-p).
outV1TDouble precision array, dimension (ldv1t, q). If jobv1t = ‘Y’, V1T contains the Q-by-Q orthogonal matrix V1**T.
inldv1tThe leading dimension of V1T. If jobv1t = ‘Y’, ldv1t >= max(1, q).
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 dorcsd2by1(
const char* jobu1,
const char* jobu2,
const char* jobv1t,
const INT m,
const INT p,
const INT q,
f64* restrict X11,
const INT ldx11,
f64* restrict X21,
const INT ldx21,
f64* restrict theta,
f64* restrict U1,
const INT ldu1,
f64* restrict U2,
const INT ldu2,
f64* restrict V1T,
const INT ldv1t,
f64* restrict work,
const INT lwork,
INT* restrict iwork,
INT* info
);