# ?labrd

Reduces the first nb rows and columns of a general matrix to a bidiagonal form.

## Syntax

call slabrd( m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, ldy )

call dlabrd( m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, ldy )

call clabrd( m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, ldy )

call zlabrd( m, n, nb, a, lda, d, e, tauq, taup, x, ldx, y, ldy )

## Description

The routine reduces the first nb rows and columns of a general m-by-n matrix A to upper or lower bidiagonal form by an orthogonal/unitary transformation Q'*A*P, and returns the matrices X and Y which are needed to apply the transformation to the unreduced part of A.

if `m ≥ n`, A is reduced to upper bidiagonal form; if `m < n`, to lower bidiagonal form.

The matrices Q and P are represented as products of elementary reflectors: `Q = H(1)*(2)* ...*H(nb),` and `P = G(1)*G(2)* ...*G(nb)`

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 scalars, and v and u are vectors.

The elements of the vectors v and u together form the m-by-nb matrix V and the nb-by-n matrix U' which are needed, with X and Y, to apply the transformation to the unreduced part of the matrix, using a block update of the form: `A := A - V*Y' - X*U'`.

This is an auxiliary routine called by ?gebrd.

## Input Parameters

m

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

n

  INTEGER. The number of columns in A (`n ≥ 0`).

nb

  INTEGER. The number of leading rows and columns of A to be reduced.

a

  REAL for slabrd

  DOUBLE PRECISION for dlabrd

  COMPLEX for clabrd

  COMPLEX*16 for zlabrd.

  Array a(lda,*) contains the matrix A to be reduced. The second dimension of a must be at least `max(1, n)`.

lda

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

ldx

  INTEGER. The first dimension of the output array x; must beat least `max(1, m)`.

ldy

  INTEGER. The first dimension of the output array y; must beat least `max(1, n)`.

## Output Parameters

a

  On exit, the first nb rows and columns of the matrix are overwritten; the rest of the array is unchanged.

  if `m ≥ n`, elements on and below the diagonal in the first nb columns, with the array tauq, represent the orthogonal/unitary matrix Q as a product of elementary reflectors; and elements above the diagonal in the first nb rows, with the array taup, represent the orthogonal/unitary matrix p as a product of elementary reflectors.

  if `m < n`, elements below the diagonal in the first nb columns, with the array tauq, represent the orthogonal/unitary matrix Q as a product of elementary reflectors, and elements on and above the diagonal in the first nb rows, with the array taup, represent the orthogonal/unitary matrix p as a product of elementary reflectors.

d, e

  REAL for single-precision flavors

  DOUBLE PRECISION for double-precision flavors. Arrays, DIMENSION (nb) each. The array d contains the diagonal elements of the first nb rows and columns of the reduced matrix:

  `d(i) = a(i,i)`.

  The array e contains the off-diagonal elements of the first nb rows and columns of the reduced matrix.

tauq, taup

  REAL for slabrd

  DOUBLE PRECISION for dlabrd

  COMPLEX for clabrd

  COMPLEX*16 for zlabrd.

  Arrays, DIMENSION (nb) each. Contain scalar factors of the elementary reflectors which represent the orthogonal/unitary matrices Q and P, respectively.

x, y

  REAL for slabrd

  DOUBLE PRECISION for dlabrd

  COMPLEX for clabrd

  COMPLEX*16 for zlabrd.

  Arrays, dimension x(ldx, nb), y(ldy, nb).

  The array x contains the m-by-nb matrix X required to update the unreduced part of A.

  The array y contains the n-by-nb matrix Y required to update the unreduced part of A.

## Application Notes

if `m ≥ n`, then for the elementary reflectors H(i) and G(i),

`v(1:i-1) = 0`, `v(i) = 1`, and `v(i:m)` is stored on exit in `a(i:m, i)`; `u(1:i) = 0`, `u(i+1) = 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).

if `m < n`,

`v(1:i) = 0`, `v(i+1) = 1`, and `v(i+1:m)` is stored on exit in `a(i+2:m, i)` ; `u(1:i-1) = 0`, `u(i) = 1`, and `u(i: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 with `nb = 2`:

where a denotes an element of the original matrix which is unchanged, vi denotes an element of the vector defining H(i), and ui an element of the vector defining G(i).

Parent topic: Auxiliary Routines