SGELS  - solve overdetermined or underdetermined real lin­
       ear systems involving an M-by-N matrix A,  or  its  trans­
       pose, using a QR or LQ factorization of A


SYNOPSIS

       SUBROUTINE SGELS( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK,
                         LWORK, INFO )

           CHARACTER     TRANS

           INTEGER       INFO, LDA, LDB, LWORK, M, N, NRHS

           REAL          A( LDA, * ), B( LDB, * ), WORK( * )


PURPOSE

       SGELS solves overdetermined or underdetermined real linear
       systems  involving  an  M-by-N matrix A, or its transpose,
       using a QR or LQ factorization of A. It is assumed that  A
       has full rank.  The following options are provided:

       1.  If  TRANS  =  'N'  and m >= n:  find the least squares
       solution of
          an overdetermined system, i.e., solve the least squares
       problem
                       minimize || B - A*X ||.

       2.  If TRANS = 'N' and m < n:  find the minimum norm solu­
       tion of
          an underdetermined system A * X = B.

       3. If TRANS = 'T' and m >= n:  find the minimum norm solu­
       tion of
          an undetermined system A**T * X = B.

       4. If TRANS = 'T' and m < n:  find the least squares solu­
       tion of
          an overdetermined system, i.e., solve the least squares
       problem
                       minimize || B - A**T * X ||.

       Several  right  hand side vectors b and solution vectors x
       can be handled in a single call; they are  stored  as  the
       columns  of the M-by-NRHS right hand side matrix B and the
       N-by-NRHS solution matrix X.


ARGUMENTS

       TRANS   (input) CHARACTER
               = 'N': the linear system involves A;
               = 'T': the linear system involves A**T.

       M       (input) INTEGER
               The number of rows of the matrix A.  M >= 0.

               The number of columns of the matrix A.  N >= 0.

       NRHS    (input) INTEGER
               The number of right hand sides, i.e.,  the  number
               of columns of the matrices B and X. NRHS >=0.

       A       (input/output) REAL array, dimension (LDA,N)
               On  entry,  the M-by-N matrix A.  On exit, if M >=
               N, A is overwritten by details of its  QR  factor­
               ization  as  returned  by  SGEQRF; if M <  N, A is
               overwritten by details of its LQ factorization  as
               returned by SGELQF.

       LDA     (input) INTEGER
               The  leading  dimension  of  the  array A.  LDA >=
               max(1,M).

       B       (input/output) REAL array, dimension (LDB,NRHS)
               On entry, the matrix B of right hand side vectors,
               stored  columnwise; B is M-by-NRHS if TRANS = 'N',
               or N-by-NRHS if TRANS = 'T'.  On exit, B is  over­
               written  by  the  solution vectors, stored column­
               wise: if TRANS = 'N' and m >= n, rows 1 to n of  B
               contain  the  least  squares solution vectors; the
               residual sum of squares for the solution  in  each
               column  is given by the sum of squares of elements
               N+1 to M in that column; if TRANS = 'N' and m < n,
               rows 1 to N of B contain the minimum norm solution
               vectors; if TRANS = 'T' and m >= n, rows 1 to M of
               B  contain  the  minimum norm solution vectors; if
               TRANS = 'T' and m < n, rows 1 to M  of  B  contain
               the  least  squares solution vectors; the residual
               sum of squares for the solution in each column  is
               given  by  the sum of squares of elements M+1 to N
               in that column.

       LDB     (input) INTEGER
               The leading dimension  of  the  array  B.  LDB  >=
               MAX(1,M,N).

       WORK    (workspace/output) REAL array, dimension (LWORK)
               On  exit, if INFO = 0, WORK(1) returns the optimal
               LWORK.

       LWORK   (input) INTEGER
               The dimension of the array WORK.  LWORK >= max( 1,
               MN  + max( MN, NRHS ) ).  For optimal performance,
               LWORK >= max( 1, MN + max( MN, NRHS )*NB ).  where
               MN = min(M,N) and NB is the optimum block size.

               If  LWORK = -1, then a workspace query is assumed;
               the routine only calculates the  optimal  size  of
               the  WORK  array,  returns this value as the first

               related to LWORK is issued by XERBLA.

       INFO    (output) INTEGER
               = 0:  successful exit
               < 0:  if INFO = -i, the i-th argument had an ille­
               gal value


Man(1) output converted with man2html