# ?ormr3/?unmr3

Multiplies a general matrix by the orthogonal/unitary matrix from a RZ factorization determined by ?tzrzf (unblocked algorithm).

## Syntax

call sormr3( side, trans, m, n, k, l, a, lda, tau, c, ldc, work, info )

call dormr3( side, trans, m, n, k, l, a, lda, tau, c, ldc, work, info )

call cunmr3( side, trans, m, n, k, l, a, lda, tau, c, ldc, work, info )

call zunmr3( side, trans, m, n, k, l, a, lda, tau, c, ldc, work, info )

## Description

The routine ?ormr3/?unmr3 overwrites the general real/complex m-by-n matrix C with

`Q*C` if `side = 'L'` and `trans = 'N'`, or

`QT*C` / `QH*C` if `side = 'L'` and `trans = 'T'` (for real flavors) or `trans = 'C'` (for complex flavors), or

`C*Q` if `side = 'R`' and `trans = 'N'`, or

`C*QT` / `C*QH` if `side = 'R'` and `trans = 'T'` (for real flavors) or `trans = 'C'` (for complex flavors).

Here Q is a real orthogonal or complex unitary matrix defined as the product of k elementary reflectors

`Q = H(1)*H(2)*...*H(k)` as returned by ?tzrzf.

Q is of order m if `side = 'L'` and of order n if `side = 'R'`.

## Input Parameters

side

  CHARACTER*1.

  = 'L': apply Q or `QT` / `QH` from the left

  = 'R': apply Q or `QT` / `QH` from the right

trans

  CHARACTER*1.

  = 'N': apply Q (no transpose)

  = 'T': apply QT (transpose, for real flavors)

  = 'C': apply QH (conjugate transpose, for complex flavors)

m

  INTEGER. The number of rows of the matrix C. `m ≥ 0`.

n

  INTEGER. The number of columns of the matrix C. `n ≥ 0`.

k

  INTEGER. The number of elementary reflectors whose product defines the matrix Q.

  If `side = 'L'`, `m ≥ k ≥ 0`;

  if side = 'R' , `n ≥ k ≥ 0`.

l

  INTEGER. The number of columns of the matrix A containing the meaningful part of the Householder reflectors.

  If `side = 'L'`, `m ≥ l ≥ 0`,

  if `side = 'R'`, `n ≥ l ≥ 0`.

a

  REAL for sormr3

  DOUBLE PRECISION for dormr3

  COMPLEX for cunmr3

  COMPLEX*16 for zunmr3.

  Array, DIMENSION

  (lda, m) if `side = 'L'`,

  (lda, n) if `side = 'R'`

  The i-th row must contain the vector which defines the elementary reflector H(i), for `i = 1,2,...,k`, as returned by ?tzrzf in the last k rows of its array argument a. The array a is modified by the routine but restored on exit.

lda

  INTEGER.

  The leading dimension of the array a. `lda ≥ max(1,k)`.

tau

  REAL for sormr3

  DOUBLE PRECISION for dormr3

  COMPLEX for cunmr3

  COMPLEX*16 for zunmr3.

  Array, DIMENSION (k).

  tau(i) must contain the scalar factor of the elementary reflector H(i), as returned by ?tzrzf.

c

  REAL for sormr3

  DOUBLE PRECISION for dormr3

  COMPLEX for cunmr3

  COMPLEX*16 for zunmr3.

  Array, DIMENSION (ldc, n).

  On entry, the m-by-n matrix C.

ldc

  INTEGER. The leading dimension of the array c. `ldc ≥ max(1,m)`.

work

  REAL for sormr3

  DOUBLE PRECISION for dormr3

  COMPLEX for cunmr3

  COMPLEX*16 for zunmr3.

  Workspace array, DIMENSION

  (n) if `side = 'L'`,

  (m) if `side = 'R'`.

## Output Parameters

c

  On exit, c is overwritten by `Q*C` or QT*C / `QH*C`, or `C*Q`, or `C*QT` / `C*QH`.

info

  INTEGER.

  = 0: successful exit

  < 0: if `info = -i`, the i-th argument had an illegal value

Parent topic: Auxiliary Routines