# ?ggsvp

Computes the preprocessing decomposition for the generalized SVD.

## Syntax

FORTRAN 77:

call sggsvp(jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, tau, work, info)

call dggsvp(jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, tau, work, info)

call cggsvp (jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork, tau, work, info)

call zggsvp(jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork, tau, work, info)

Fortran 95:

call ggsvp(a, b, tola, tolb [, k] [,l] [,u] [,v] [,q] [,info])

## Description

This routine computes orthogonal matrices U, V and Q such that

where the k-by-k matrix A12 and l-by-l matrix B13 are nonsingular upper triangular; A23 is l-by-l upper triangular if `m-k-l ≥0`, otherwise A23 is (m-k)-by-l upper trapezoidal. The sum k+l is equal to the effective numerical rank of the (m+p)-by-n matrix (AH,BH)H.

This decomposition is the preprocessing step for computing the Generalized Singular Value Decomposition (GSVD), see subroutine ?ggsvd.

## Input Parameters

jobu

  CHARACTER*1. Must be 'U' or 'N'.

  If `jobu = 'U'`, orthogonal/unitary matrix U is computed.

  If `jobu = 'N'`, U is not computed.

jobv

  CHARACTER*1. Must be 'V' or 'N'.

  If `jobv = 'V'`, orthogonal/unitary matrix V is computed.

  If `jobv = 'N'`, V is not computed.

jobq

  CHARACTER*1. Must be 'Q' or 'N'.

  If `jobq = 'Q'`, orthogonal/unitary matrix Q is computed.

  If `jobq = 'N'`, Q is not computed.

m

  INTEGER. The number of rows of the matrix A (m ≥ 0).

p

  INTEGER. The number of rows of the matrix B (p ≥ 0).

n

  INTEGER. The number of columns of the matrices A and B (n ≥ 0).

a, b, tau, work

  REAL for sggsvp

  DOUBLE PRECISION for dggsvp

  COMPLEX for cggsvp

  DOUBLE COMPLEX for zggsvp.

  Arrays:

  a(lda,*) contains the m-by-n matrix A.

  The second dimension of a must be at least max(1, n).

  b(ldb,*) contains the p-by-n matrix B.

  The second dimension of b must be at least max(1, n).

  tau(*) is a workspace array.

  The dimension of tau must be at least max(1, n).

  work(*) is a workspace array.

  The dimension of work must be at least max(1, 3n, m, p).

lda

  INTEGER. The first dimension of a; at least max(1, m).

ldb

  INTEGER. The first dimension of b; at least max(1, p).

tola, tolb

  REAL for single-precision flavors

  DOUBLE PRECISION for double-precision flavors.

  tola and tolb are the thresholds to determine the effective numerical rank of matrix B and a subblock of A. Generally, they are set to

  `tola = max(m, n)*||A||*MACHEPS`,

  `tolb = max(p, n)*||B||*MACHEPS`.

  The size of tola and tolb may affect the size of backward errors of the decomposition.

ldu

  INTEGER. The first dimension of the output array u . `ldu ≥ max(1, m)` if `jobu = 'U'`; `ldu ≥ 1` otherwise.

ldv

  INTEGER. The first dimension of the output array v . `ldv ≥ max(1, p)` if `jobv = 'V'`; `ldv ≥ 1` otherwise.

ldq

  INTEGER. The first dimension of the output array q . `ldq ≥ max(1, n)` if `jobq = 'Q'`; `ldq ≥ 1` otherwise.

iwork

  INTEGER. Workspace array, DIMENSION at least max(1, n).

rwork

  REAL for cggsvp

  DOUBLE PRECISION for zggsvp.

  Workspace array, DIMENSION at least max(1, 2n). Used in complex flavors only.

## Output Parameters

a

  Overwritten by the triangular (or trapezoidal) matrix described in the Description section.

b

  Overwritten by the triangular matrix described in the Description section.

k, l

  INTEGER. On exit, k and l specify the dimension of subblocks. The sum k + l is equal to effective numerical rank of (AH, BH)H.

u, v, q

  REAL for sggsvp

  DOUBLE PRECISION for dggsvp

  COMPLEX for cggsvp

  DOUBLE COMPLEX for zggsvp.

  Arrays:

  If `jobu = 'U'`, u(ldu,*) contains the orthogonal/unitary matrix U.

  The second dimension of u must be at least max(1, m).

  If `jobu = 'N'`, u is not referenced.

  If `jobv = 'V'`, v(ldv,*) contains the orthogonal/unitary matrix V.

  The second dimension of v must be at least max(1, m).

  If `jobv = 'N'`, v is not referenced.

  If `jobq = 'Q'`, q(ldq,*) contains the orthogonal/unitary matrix Q.

  The second dimension of q must be at least max(1, n).

  If `jobq = 'N'`, q is not referenced.

info

  INTEGER.

  If `info = 0`, the execution is successful.

  If info = -i, the i-th parameter had an illegal value.

## Fortran 95 Interface Notes

Routines in Fortran 95 interface have fewer arguments in the calling sequence than their FORTRAN 77 counterparts. For general conventions applied to skip redundant or restorable arguments, see Fortran 95 Interface Conventions.

Specific details for the routine ggsvp interface are the following:

a

  Holds the matrix A of size (m,n).

b

  Holds the matrix B of size (p,n).

u

  Holds the matrix U of size (m,m).

v

  Holds the matrix V of size (p,m).

q

  Holds the matrix Q of size (n,n).

jobu

  Restored based on the presence of the argument u as follows:

  `jobu = 'U'`, if u is present,

  `jobu = 'N'`, if u is omitted.

jobv

  Restored based on the presence of the argument v as follows:

  `jobz = 'V'`, if v is present,

  `jobz = 'N'`, if v is omitted.

jobq

  Restored based on the presence of the argument q as follows:

  `jobz = 'Q'`, if q is present,

  `jobz = 'N'`, if q is omitted.

Parent topic: Generalized Singular Value Decomposition