# ?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 )

• mkl.fi

## 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

DOUBLE COMPLEX 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 leading dimension of a; at least `max(1, m)`.

ldx

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

ldy

INTEGER. The leading 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

DOUBLE COMPLEX 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

DOUBLE COMPLEX 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).

For more complete information about compiler optimizations, see our Optimization Notice.