**Purpose**

To determine the minimum-norm solution to a real linear least squares problem: minimize || A * X - B ||, using the rank-revealing QR factorization of a real general M-by-N matrix A, computed by SLICOT Library routine MB03OD.

SUBROUTINE MB02QY( M, N, NRHS, RANK, A, LDA, JPVT, B, LDB, TAU, $ DWORK, LDWORK, INFO ) C .. Scalar Arguments .. INTEGER INFO, LDA, LDB, LDWORK, M, N, NRHS, RANK C .. Array Arguments .. INTEGER JPVT( * ) DOUBLE PRECISION A( LDA, * ), B( LDB, * ), DWORK( * ), TAU( * )

**Input/Output Parameters**

M (input) INTEGER The number of rows of the matrices A and B. M >= 0. N (input) INTEGER The number of columns of the matrix A. N >= 0. NRHS (input) INTEGER The number of columns of the matrix B. NRHS >= 0. RANK (input) INTEGER The effective rank of A, as returned by SLICOT Library routine MB03OD. min(M,N) >= RANK >= 0. A (input/output) DOUBLE PRECISION array, dimension ( LDA, N ) On entry, the leading min(M,N)-by-N upper trapezoidal part of this array contains the triangular factor R, as returned by SLICOT Library routine MB03OD. The strict lower trapezoidal part of A is not referenced. On exit, if RANK < N, the leading RANK-by-RANK upper triangular part of this array contains the upper triangular matrix R of the complete orthogonal factorization of A, and the submatrix (1:RANK,RANK+1:N) of this array, with the array TAU, represent the orthogonal matrix Z (of the complete orthogonal factorization of A), as a product of RANK elementary reflectors. On exit, if RANK = N, this array is unchanged. LDA INTEGER The leading dimension of the array A. LDA >= max(1,M). JPVT (input) INTEGER array, dimension ( N ) The recorded permutations performed by SLICOT Library routine MB03OD; if JPVT(i) = k, then the i-th column of A*P was the k-th column of the original matrix A. B (input/output) DOUBLE PRECISION array, dimension ( LDB, NRHS ) On entry, if NRHS > 0, the leading M-by-NRHS part of this array must contain the matrix B (corresponding to the transformed matrix A, returned by SLICOT Library routine MB03OD). On exit, if NRHS > 0, the leading N-by-NRHS part of this array contains the solution matrix X. If M >= N and RANK = N, the residual sum-of-squares for the solution in the i-th column is given by the sum of squares of elements N+1:M in that column. If NRHS = 0, the array B is not referenced. LDB INTEGER The leading dimension of the array B. LDB >= max(1,M,N), if NRHS > 0. LDB >= 1, if NRHS = 0. TAU (output) DOUBLE PRECISION array, dimension ( min(M,N) ) The scalar factors of the elementary reflectors. If RANK = N, the array TAU is not referenced.

DWORK DOUBLE PRECISION array, dimension ( LDWORK ) On exit, if INFO = 0, DWORK(1) returns the optimal value of LDWORK. LDWORK INTEGER The length of the array DWORK. LDWORK >= max( 1, N, NRHS ). For good performance, LDWORK should sometimes be larger. If LDWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the DWORK array, returns this value as the first entry of the DWORK array, and no error message related to LDWORK is issued by XERBLA.

INFO INTEGER = 0: successful exit; < 0: if INFO = -i, the i-th argument had an illegal value.

The routine uses a QR factorization with column pivoting: A * P = Q * R = Q * [ R11 R12 ], [ 0 R22 ] where R11 is an upper triangular submatrix of estimated rank RANK, the effective rank of A. The submatrix R22 can be considered as negligible. If RANK < N, then R12 is annihilated by orthogonal transformations from the right, arriving at the complete orthogonal factorization: A * P = Q * [ T11 0 ] * Z. [ 0 0 ] The minimum-norm solution is then X = P * Z' [ inv(T11)*Q1'*B ], [ 0 ] where Q1 consists of the first RANK columns of Q. The input data for MB02QY are the transformed matrices Q' * A (returned by SLICOT Library routine MB03OD) and Q' * B. Matrix Q is not needed.

The implemented method is numerically stable.

None

**Program Text**

None

None

None