SGEBRD - reduce a general real M-by-N matrix A to upper or
       lower bidiagonal form B by an orthogonal transformation


SYNOPSIS

       SUBROUTINE SGEBRD( M, N, A, LDA, D, E, TAUQ,  TAUP,  WORK,
                          LWORK, INFO )

           INTEGER        INFO, LDA, LWORK, M, N

           REAL           A( LDA, * ), D( * ), E( * ), TAUP( * ),
                          TAUQ( * ), WORK( * )


PURPOSE

       SGEBRD reduces a general real M-by-N matrix A to upper  or
       lower  bidiagonal  form B by an orthogonal transformation:
       Q**T * A * P = B.  If m >= n, B is upper bidiagonal; if  m
       < n, B is lower bidiagonal.


ARGUMENTS

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

       N       (input) INTEGER
               The number of columns in the matrix A.  N >= 0.

       A       (input/output) REAL array, dimension (LDA,N)
               On entry, the M-by-N general matrix to be reduced.
               On exit, if m >= n, the  diagonal  and  the  first
               superdiagonal are overwritten with the upper bidi­
               agonal matrix B; the elements below the  diagonal,
               with  the  array  TAUQ,  represent  the orthogonal
               matrix Q as a product  of  elementary  reflectors,
               and  the  elements  above the first superdiagonal,
               with the  array  TAUP,  represent  the  orthogonal
               matrix P as a product of elementary reflectors; if
               m < n, the diagonal and the first subdiagonal  are
               overwritten  with  the  lower bidiagonal matrix B;
               the elements below the first subdiagonal, with the
               array TAUQ, represent the orthogonal matrix Q as a
               product of elementary reflectors, and the elements
               above the diagonal, with the array TAUP, represent
               the orthogonal matrix P as a product of elementary
               reflectors.  See Further Details.  LDA     (input)
               INTEGER The leading dimension of the array A.  LDA
               >= max(1,M).

       D       (output) REAL array, dimension (min(M,N))
               The  diagonal elements of the bidiagonal matrix B:
               D(i) = A(i,i).

       E       (output) REAL array, dimension (min(M,N)-1)
               The off-diagonal elements of the bidiagonal matrix

               if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1.

       TAUQ    (output) REAL array dimension (min(M,N))
               The scalar factors of  the  elementary  reflectors
               which  represent the orthogonal matrix Q. See Fur­
               ther Details.  TAUP    (output) REAL array, dimen­
               sion  (min(M,N)) The scalar factors of the elemen­
               tary reflectors  which  represent  the  orthogonal
               matrix    P.    See    Further    Details.    WORK
               (workspace/output) REAL array,  dimension  (LWORK)
               On  exit, if INFO = 0, WORK(1) returns the optimal
               LWORK.

       LWORK   (input) INTEGER
               The  length  of  the   array   WORK.    LWORK   >=
               max(1,M,N).   For  optimum  performance  LWORK  >=
               (M+N)*NB, where NB is the optimal blocksize.

               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
               entry  of  the  WORK  array,  and no error message
               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.


FURTHER DETAILS

       The  matrices  Q and P are represented as products of ele­
       mentary reflectors:

       If m >= n,

          Q = H(1) H(2) . . . H(n)  and  P =  G(1)  G(2)  .  .  .
       G(n-1)

       Each H(i) and G(i) has the form:

          H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'

       where tauq and taup are real scalars, and v and u are real
       vectors; v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on
       exit  in  A(i+1:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+2:n)
       is stored on exit in A(i,i+2:n); tauq is stored in TAUQ(i)
       and taup in TAUP(i).

       If m < n,

          Q  =  H(1)  H(2) . . . H(m-1)  and  P = G(1) G(2) . . .
       G(m)


          H(i) = I - tauq * v * v'  and G(i) = I - taup * u * u'

       where tauq and taup are real scalars, and v and u are real
       vectors; v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on
       exit in A(i+2:m,i); u(1:i-1) = 0, u(i) = 1,  and  u(i+1:n)
       is stored on exit in A(i,i+1:n); tauq is stored in TAUQ(i)
       and taup in TAUP(i).

       The contents of A on exit are illustrated by the following
       examples:

       m = 6 and n = 5 (m > n):          m = 5 and n = 6 (m < n):

         (  d   e   u1  u1  u1 )           (  d   u1  u1  u1   u1
       u1 )
         (   v1  d   e   u2  u2 )           (  e   d   u2  u2  u2
       u2 )
         (  v1  v2  d   e   u3 )           (  v1  e   d   u3   u3
       u3 )
         (   v1  v2  v3  d   e  )           (  v1  v2  e   d   u4
       u4 )
         (  v1  v2  v3  v4  d  )           (  v1  v2  v3   e    d
       u5 )
         (  v1  v2  v3  v4  v5 )

       where d and e denote diagonal and off-diagonal elements of
       B, vi denotes an element of the vector defining H(i),  and
       ui an element of the vector defining G(i).


Man(1) output converted with man2html