f08 Chapter Contents
f08 Chapter Introduction
NAG C Library Manual

# NAG Library Function Documentnag_zunmbr (f08kuc)

## 1  Purpose

nag_zunmbr (f08kuc) multiplies an arbitrary complex $m$ by $n$ matrix $C$ by one of the complex unitary matrices $Q$ or $P$ which were determined by nag_zgebrd (f08ksc) when reducing a complex matrix to bidiagonal form.

## 2  Specification

 #include #include
 void nag_zunmbr (Nag_OrderType order, Nag_VectType vect, Nag_SideType side, Nag_TransType trans, Integer m, Integer n, Integer k, const Complex a[], Integer pda, const Complex tau[], Complex c[], Integer pdc, NagError *fail)

## 3  Description

nag_zunmbr (f08kuc) is intended to be used after a call to nag_zgebrd (f08ksc), which reduces a complex rectangular matrix $A$ to real bidiagonal form $B$ by a unitary transformation: $A=QB{P}^{\mathrm{H}}$. nag_zgebrd (f08ksc) represents the matrices $Q$ and ${P}^{\mathrm{H}}$ as products of elementary reflectors.
This function may be used to form one of the matrix products
 $QC , QHC , CQ , CQH , PC , PHC , CP ​ or ​ CPH ,$
overwriting the result on $C$ (which may be any complex rectangular matrix).

## 4  References

Golub G H and Van Loan C F (1996) Matrix Computations (3rd Edition) Johns Hopkins University Press, Baltimore

## 5  Arguments

Note: in the descriptions below, $\mathit{r}$ denotes the order of $Q$ or ${P}^{\mathrm{H}}$: if ${\mathbf{side}}=\mathrm{Nag_LeftSide}$, $\mathit{r}={\mathbf{m}}$ and if ${\mathbf{side}}=\mathrm{Nag_RightSide}$, $\mathit{r}={\mathbf{n}}$.
1:     orderNag_OrderTypeInput
On entry: the order argument specifies the two-dimensional storage scheme being used, i.e., row-major ordering or column-major ordering. C language defined storage is specified by ${\mathbf{order}}=\mathrm{Nag_RowMajor}$. See Section 3.2.1.3 in the Essential Introduction for a more detailed explanation of the use of this argument.
Constraint: ${\mathbf{order}}=\mathrm{Nag_RowMajor}$ or Nag_ColMajor.
2:     vectNag_VectTypeInput
On entry: indicates whether $Q$ or ${Q}^{\mathrm{H}}$ or $P$ or ${P}^{\mathrm{H}}$ is to be applied to $C$.
${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$
$Q$ or ${Q}^{\mathrm{H}}$ is applied to $C$.
${\mathbf{vect}}=\mathrm{Nag_ApplyP}$
$P$ or ${P}^{\mathrm{H}}$ is applied to $C$.
Constraint: ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$ or $\mathrm{Nag_ApplyP}$.
3:     sideNag_SideTypeInput
On entry: indicates how $Q$ or ${Q}^{\mathrm{H}}$ or $P$ or ${P}^{\mathrm{H}}$ is to be applied to $C$.
${\mathbf{side}}=\mathrm{Nag_LeftSide}$
$Q$ or ${Q}^{\mathrm{H}}$ or $P$ or ${P}^{\mathrm{H}}$ is applied to $C$ from the left.
${\mathbf{side}}=\mathrm{Nag_RightSide}$
$Q$ or ${Q}^{\mathrm{H}}$ or $P$ or ${P}^{\mathrm{H}}$ is applied to $C$ from the right.
Constraint: ${\mathbf{side}}=\mathrm{Nag_LeftSide}$ or $\mathrm{Nag_RightSide}$.
4:     transNag_TransTypeInput
On entry: indicates whether $Q$ or $P$ or ${Q}^{\mathrm{H}}$ or ${P}^{\mathrm{H}}$ is to be applied to $C$.
${\mathbf{trans}}=\mathrm{Nag_NoTrans}$
$Q$ or $P$ is applied to $C$.
${\mathbf{trans}}=\mathrm{Nag_ConjTrans}$
${Q}^{\mathrm{H}}$ or ${P}^{\mathrm{H}}$ is applied to $C$.
Constraint: ${\mathbf{trans}}=\mathrm{Nag_NoTrans}$ or $\mathrm{Nag_ConjTrans}$.
5:     mIntegerInput
On entry: $m$, the number of rows of the matrix $C$.
Constraint: ${\mathbf{m}}\ge 0$.
6:     nIntegerInput
On entry: $n$, the number of columns of the matrix $C$.
Constraint: ${\mathbf{n}}\ge 0$.
7:     kIntegerInput
On entry: if ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$, the number of columns in the original matrix $A$.
If ${\mathbf{vect}}=\mathrm{Nag_ApplyP}$, the number of rows in the original matrix $A$.
Constraint: ${\mathbf{k}}\ge 0$.
8:     a[$\mathit{dim}$]const ComplexInput
Note: the dimension, dim, of the array a must be at least
• $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{pda}}×\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(\mathit{r},{\mathbf{k}}\right)\right)$ when ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$ and ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathit{r}×{\mathbf{pda}}\right)$ when ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$ and ${\mathbf{order}}=\mathrm{Nag_RowMajor}$;
• $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{pda}}×\mathit{r}\right)$ when ${\mathbf{vect}}=\mathrm{Nag_ApplyP}$ and ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(\mathit{r},{\mathbf{k}}\right)×{\mathbf{pda}}\right)$ when ${\mathbf{vect}}=\mathrm{Nag_ApplyP}$ and ${\mathbf{order}}=\mathrm{Nag_RowMajor}$.
On entry: details of the vectors which define the elementary reflectors, as returned by nag_zgebrd (f08ksc).
9:     pdaIntegerInput
On entry: the stride separating row or column elements (depending on the value of order) in the array a.
Constraints:
• if ${\mathbf{order}}=\mathrm{Nag_ColMajor}$,
• if ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$, ${\mathbf{pda}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathit{r}\right)$;
• if ${\mathbf{vect}}=\mathrm{Nag_ApplyP}$, ${\mathbf{pda}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(\mathit{r},{\mathbf{k}}\right)\right)$;
• if ${\mathbf{order}}=\mathrm{Nag_RowMajor}$,
• if ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$, ${\mathbf{pda}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(\mathit{r},{\mathbf{k}}\right)\right)$;
• if ${\mathbf{vect}}=\mathrm{Nag_ApplyP}$, ${\mathbf{pda}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathit{r}\right)$.
10:   tau[$\mathit{dim}$]const ComplexInput
Note: the dimension, dim, of the array tau must be at least $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(\mathit{r},{\mathbf{k}}\right)\right)$.
On entry: further details of the elementary reflectors, as returned by nag_zgebrd (f08ksc) in its argument tauq if ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$, or in its argument taup if ${\mathbf{vect}}=\mathrm{Nag_ApplyP}$.
11:   c[$\mathit{dim}$]ComplexInput/Output
Note: the dimension, dim, of the array c must be at least
• $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{pdc}}×{\mathbf{n}}\right)$ when ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{m}}×{\mathbf{pdc}}\right)$ when ${\mathbf{order}}=\mathrm{Nag_RowMajor}$.
The $\left(i,j\right)$th element of the matrix $C$ is stored in
• ${\mathbf{c}}\left[\left(j-1\right)×{\mathbf{pdc}}+i-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_ColMajor}$;
• ${\mathbf{c}}\left[\left(i-1\right)×{\mathbf{pdc}}+j-1\right]$ when ${\mathbf{order}}=\mathrm{Nag_RowMajor}$.
On entry: the matrix $C$.
On exit: c is overwritten by $QC$ or ${Q}^{\mathrm{H}}C$ or $CQ$ or ${C}^{\mathrm{H}}Q$ or $PC$ or ${P}^{\mathrm{H}}C$ or $CP$ or ${C}^{\mathrm{H}}P$ as specified by vect, side and trans.
12:   pdcIntegerInput
On entry: the stride separating row or column elements (depending on the value of order) in the array c.
Constraints:
• if ${\mathbf{order}}=\mathrm{Nag_ColMajor}$, ${\mathbf{pdc}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{m}}\right)$;
• if ${\mathbf{order}}=\mathrm{Nag_RowMajor}$, ${\mathbf{pdc}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
13:   failNagError *Input/Output
The NAG error argument (see Section 3.6 in the Essential Introduction).

## 6  Error Indicators and Warnings

NE_ALLOC_FAIL
Dynamic memory allocation failed.
On entry, argument $〈\mathit{\text{value}}〉$ had an illegal value.
NE_ENUM_INT_2
On entry, ${\mathbf{vect}}=〈\mathit{\text{value}}〉$, ${\mathbf{pda}}=〈\mathit{\text{value}}〉$, ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: if ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$, ${\mathbf{pda}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(\mathit{r},{\mathbf{k}}\right)\right)$;
if ${\mathbf{vect}}=\mathrm{Nag_ApplyP}$, ${\mathbf{pda}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathit{r}\right)$.
On entry, ${\mathbf{vect}}=〈\mathit{\text{value}}〉$, ${\mathbf{pda}}=〈\mathit{\text{value}}〉$ and ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: if ${\mathbf{vect}}=\mathrm{Nag_ApplyQ}$, ${\mathbf{pda}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathit{r}\right)$;
if ${\mathbf{vect}}=\mathrm{Nag_ApplyP}$, ${\mathbf{pda}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(\mathit{r},{\mathbf{k}}\right)\right)$.
NE_INT
On entry, ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{k}}\ge 0$.
On entry, ${\mathbf{m}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{m}}\ge 0$.
On entry, ${\mathbf{n}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{n}}\ge 0$.
On entry, ${\mathbf{pda}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pda}}>0$.
On entry, ${\mathbf{pdc}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pdc}}>0$.
NE_INT_2
On entry, ${\mathbf{pdc}}=〈\mathit{\text{value}}〉$ and ${\mathbf{m}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pdc}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{m}}\right)$.
On entry, ${\mathbf{pdc}}=〈\mathit{\text{value}}〉$ and ${\mathbf{n}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{pdc}}\ge \mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
NE_INTERNAL_ERROR
An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please contact NAG for assistance.

## 7  Accuracy

The computed result differs from the exact result by a matrix $E$ such that
 $E2 = Oε C2 ,$
where $\epsilon$ is the machine precision.

The total number of real floating point operations is approximately
• if ${\mathbf{side}}=\mathrm{Nag_LeftSide}$ and $m\ge k$, $8nk\left(2m-k\right)$;
• if ${\mathbf{side}}=\mathrm{Nag_RightSide}$ and $n\ge k$, $8mk\left(2n-k\right)$;
• if ${\mathbf{side}}=\mathrm{Nag_LeftSide}$ and $m, $8{m}^{2}n$;
• if ${\mathbf{side}}=\mathrm{Nag_RightSide}$ and $n, $8m{n}^{2}$,
where $k$ is the value of the argument k.
The real analogue of this function is nag_dormbr (f08kgc).

## 9  Example

For this function two examples are presented. Both illustrate how the reduction to bidiagonal form of a matrix $A$ may be preceded by a $QR$ or $LQ$ factorization of $A$.
In the first example, $m>n$, and
 $A = 0.96-0.81i -0.03+0.96i -0.91+2.06i -0.05+0.41i -0.98+1.98i -1.20+0.19i -0.66+0.42i -0.81+0.56i 0.62-0.46i 1.01+0.02i 0.63-0.17i -1.11+0.60i -0.37+0.38i 0.19-0.54i -0.98-0.36i 0.22-0.20i 0.83+0.51i 0.20+0.01i -0.17-0.46i 1.47+1.59i 1.08-0.28i 0.20-0.12i -0.07+1.23i 0.26+0.26i .$
The function first performs a $QR$ factorization of $A$ as $A={Q}_{a}R$ and then reduces the factor $R$ to bidiagonal form $B$: $R={Q}_{b}B{P}^{\mathrm{H}}$. Finally it forms ${Q}_{a}$ and calls nag_zunmbr (f08kuc) to form $Q={Q}_{a}{Q}_{b}$.
In the second example, $m, and
 $A = 0.28-0.36i 0.50-0.86i -0.77-0.48i 1.58+0.66i -0.50-1.10i -1.21+0.76i -0.32-0.24i -0.27-1.15i 0.36-0.51i -0.07+1.33i -0.75+0.47i -0.08+1.01i .$
The function first performs an $LQ$ factorization of $A$ as $A=L{P}_{a}^{\mathrm{H}}$ and then reduces the factor $L$ to bidiagonal form $B$: $L=QB{P}_{b}^{\mathrm{H}}$. Finally it forms ${P}_{b}^{\mathrm{H}}$ and calls nag_zunmbr (f08kuc) to form ${P}^{\mathrm{H}}={P}_{b}^{\mathrm{H}}{P}_{a}^{\mathrm{H}}$.

### 9.1  Program Text

Program Text (f08kuce.c)

### 9.2  Program Data

Program Data (f08kuce.d)

### 9.3  Program Results

Program Results (f08kuce.r)