uncsd2by1#

Functions

void cuncsd2by1(
    const char*          jobu1,
    const char*          jobu2,
    const char*          jobv1t,
    const INT            m,
    const INT            p,
    const INT            q,
          c64*  restrict X11,
    const INT            ldx11,
          c64*  restrict X21,
    const INT            ldx21,
          f32*  restrict theta,
          c64*  restrict U1,
    const INT            ldu1,
          c64*  restrict U2,
    const INT            ldu2,
          c64*  restrict V1T,
    const INT            ldv1t,
          c64*  restrict work,
    const INT            lwork,
          f32*  restrict rwork,
    const INT            lrwork,
          INT*  restrict iwork,
          INT*           info
);
void cuncsd2by1(const char *jobu1, const char *jobu2, const char *jobv1t, const INT m, const INT p, const INT q, c64 *restrict X11, const INT ldx11, c64 *restrict X21, const INT ldx21, f32 *restrict theta, c64 *restrict U1, const INT ldu1, c64 *restrict U2, const INT ldu2, c64 *restrict V1T, const INT ldv1t, c64 *restrict work, const INT lwork, f32 *restrict rwork, const INT lrwork, INT *restrict iwork, INT *info)#

CUNCSD2BY1 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:

                           [  I1 0  0 ]
                           [  0  C  0 ]
     [ X11 ]   [ U1 |    ] [  0  0  0 ]
 X = [-----] = [---------] [----------] V1**H .
     [ X21 ]   [    | U2 ] [  0  0  0 ]
                           [  0  S  0 ]
                           [  0  0  I2]
X11 is P-by-Q. The unitary 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).

Parameters

in
jobu1

= ‘Y’: U1 is computed; otherwise: U1 is not computed.

in
jobu2

= ‘Y’: U2 is computed; otherwise: U2 is not computed.

in
jobv1t

= ‘Y’: V1T is computed; otherwise: V1T is not computed.

in
m

The number of rows in X.

in
p

The number of rows in X11. 0 <= p <= m.

in
q

The number of columns in X11 and X21. 0 <= q <= m.

inout
X11

Complex*16 array, dimension (ldx11, q). On entry, part of the unitary matrix whose CSD is desired.

in
ldx11

The leading dimension of X11. ldx11 >= max(1, p).

inout
X21

Complex*16 array, dimension (ldx21, q). On entry, part of the unitary matrix whose CSD is desired.

in
ldx21

The leading dimension of X21. ldx21 >= max(1, m-p).

out
theta

Single 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)) ).

out
U1

Complex*16 array, dimension (ldu1, p). If jobu1 = ‘Y’, U1 contains the P-by-P unitary matrix U1.

in
ldu1

The leading dimension of U1. If jobu1 = ‘Y’, ldu1 >= max(1, p).

out
U2

Complex*16 array, dimension (ldu2, m-p). If jobu2 = ‘Y’, U2 contains the (M-P)-by-(M-P) unitary matrix U2.

in
ldu2

The leading dimension of U2. If jobu2 = ‘Y’, ldu2 >= max(1, m-p).

out
V1T

Complex*16 array, dimension (ldv1t, q). If jobv1t = ‘Y’, V1T contains the Q-by-Q unitary matrix V1**H.

in
ldv1t

The leading dimension of V1T. If jobv1t = ‘Y’, ldv1t >= max(1, q).

out
work

Complex*16 array, dimension (max(1, lwork)). On exit, if info = 0, work[0] returns the optimal lwork.

in
lwork

The dimension of the array work. If lwork = -1, a workspace query is assumed.

out
rwork

Single precision array, dimension (max(1, lrwork)). On exit, if info = 0, rwork[0] returns the optimal lrwork.

in
lrwork

The dimension of the array rwork. If lrwork = -1, a workspace query is assumed.

out
iwork

Integer array, dimension (m - min(p, m-p, q, m-q)).

out
info

  • = 0: successful exit.

  • < 0: if info = -i, the i-th argument had an illegal value.

  • > 0: CBBCSD did not converge.

Functions

void zuncsd2by1(
    const char*          jobu1,
    const char*          jobu2,
    const char*          jobv1t,
    const INT            m,
    const INT            p,
    const INT            q,
          c128* restrict X11,
    const INT            ldx11,
          c128* restrict X21,
    const INT            ldx21,
          f64*  restrict theta,
          c128* restrict U1,
    const INT            ldu1,
          c128* restrict U2,
    const INT            ldu2,
          c128* restrict V1T,
    const INT            ldv1t,
          c128* restrict work,
    const INT            lwork,
          f64*  restrict rwork,
    const INT            lrwork,
          INT*  restrict iwork,
          INT*           info
);
void zuncsd2by1(const char *jobu1, const char *jobu2, const char *jobv1t, const INT m, const INT p, const INT q, c128 *restrict X11, const INT ldx11, c128 *restrict X21, const INT ldx21, f64 *restrict theta, c128 *restrict U1, const INT ldu1, c128 *restrict U2, const INT ldu2, c128 *restrict V1T, const INT ldv1t, c128 *restrict work, const INT lwork, f64 *restrict rwork, const INT lrwork, INT *restrict iwork, INT *info)#

ZUNCSD2BY1 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:

                           [  I1 0  0 ]
                           [  0  C  0 ]
     [ X11 ]   [ U1 |    ] [  0  0  0 ]
 X = [-----] = [---------] [----------] V1**H .
     [ X21 ]   [    | U2 ] [  0  0  0 ]
                           [  0  S  0 ]
                           [  0  0  I2]
X11 is P-by-Q. The unitary 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).

Parameters

in
jobu1

= ‘Y’: U1 is computed; otherwise: U1 is not computed.

in
jobu2

= ‘Y’: U2 is computed; otherwise: U2 is not computed.

in
jobv1t

= ‘Y’: V1T is computed; otherwise: V1T is not computed.

in
m

The number of rows in X.

in
p

The number of rows in X11. 0 <= p <= m.

in
q

The number of columns in X11 and X21. 0 <= q <= m.

inout
X11

Complex*16 array, dimension (ldx11, q). On entry, part of the unitary matrix whose CSD is desired.

in
ldx11

The leading dimension of X11. ldx11 >= max(1, p).

inout
X21

Complex*16 array, dimension (ldx21, q). On entry, part of the unitary matrix whose CSD is desired.

in
ldx21

The leading dimension of X21. ldx21 >= max(1, m-p).

out
theta

Double 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)) ).

out
U1

Complex*16 array, dimension (ldu1, p). If jobu1 = ‘Y’, U1 contains the P-by-P unitary matrix U1.

in
ldu1

The leading dimension of U1. If jobu1 = ‘Y’, ldu1 >= max(1, p).

out
U2

Complex*16 array, dimension (ldu2, m-p). If jobu2 = ‘Y’, U2 contains the (M-P)-by-(M-P) unitary matrix U2.

in
ldu2

The leading dimension of U2. If jobu2 = ‘Y’, ldu2 >= max(1, m-p).

out
V1T

Complex*16 array, dimension (ldv1t, q). If jobv1t = ‘Y’, V1T contains the Q-by-Q unitary matrix V1**H.

in
ldv1t

The leading dimension of V1T. If jobv1t = ‘Y’, ldv1t >= max(1, q).

out
work

Complex*16 array, dimension (max(1, lwork)). On exit, if info = 0, work[0] returns the optimal lwork.

in
lwork

The dimension of the array work. If lwork = -1, a workspace query is assumed.

out
rwork

Double precision array, dimension (max(1, lrwork)). On exit, if info = 0, rwork[0] returns the optimal lrwork.

in
lrwork

The dimension of the array rwork. If lrwork = -1, a workspace query is assumed.

out
iwork

Integer array, dimension (m - min(p, m-p, q, m-q)).

out
info

  • = 0: successful exit.

  • < 0: if info = -i, the i-th argument had an illegal value.

  • > 0: ZBBCSD did not converge.