nag_zunmbr (f08kuc) (PDF version)
f08 Chapter Contents
f08 Chapter Introduction
NAG C Library Manual

NAG Library Function Document

nag_zunmbr (f08kuc)

+ Contents

    1  Purpose
    7  Accuracy

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 <nag.h>
#include <nagf08.h>
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=QBPH. nag_zgebrd (f08ksc) represents the matrices Q and PH 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, r denotes the order of Q or PH: if side=Nag_LeftSide, r=m and if side=Nag_RightSide, r=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 order=Nag_RowMajor. See Section 3.2.1.3 in the Essential Introduction for a more detailed explanation of the use of this argument.
Constraint: order=Nag_RowMajor or Nag_ColMajor.
2:     vectNag_VectTypeInput
On entry: indicates whether Q or QH or P or PH is to be applied to C.
vect=Nag_ApplyQ
Q or QH is applied to C.
vect=Nag_ApplyP
P or PH is applied to C.
Constraint: vect=Nag_ApplyQ or Nag_ApplyP.
3:     sideNag_SideTypeInput
On entry: indicates how Q or QH or P or PH is to be applied to C.
side=Nag_LeftSide
Q or QH or P or PH is applied to C from the left.
side=Nag_RightSide
Q or QH or P or PH is applied to C from the right.
Constraint: side=Nag_LeftSide or Nag_RightSide.
4:     transNag_TransTypeInput
On entry: indicates whether Q or P or QH or PH is to be applied to C.
trans=Nag_NoTrans
Q or P is applied to C.
trans=Nag_ConjTrans
QH or PH is applied to C.
Constraint: trans=Nag_NoTrans or Nag_ConjTrans.
5:     mIntegerInput
On entry: m, the number of rows of the matrix C.
Constraint: m0.
6:     nIntegerInput
On entry: n, the number of columns of the matrix C.
Constraint: n0.
7:     kIntegerInput
On entry: if vect=Nag_ApplyQ, the number of columns in the original matrix A.
If vect=Nag_ApplyP, the number of rows in the original matrix A.
Constraint: k0.
8:     a[dim]const ComplexInput
Note: the dimension, dim, of the array a must be at least
  • max1,pda× minr,k  when vect=Nag_ApplyQ and order=Nag_ColMajor;
  • max1,r×pda when vect=Nag_ApplyQ and order=Nag_RowMajor;
  • max1,pda×r when vect=Nag_ApplyP and order=Nag_ColMajor;
  • max1,minr,k×pda when vect=Nag_ApplyP and order=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 order=Nag_ColMajor,
    • if vect=Nag_ApplyQ, pda max1,r ;
    • if vect=Nag_ApplyP, pda max1,minr,k ;
  • if order=Nag_RowMajor,
    • if vect=Nag_ApplyQ, pda max1,minr,k ;
    • if vect=Nag_ApplyP, pdamax1,r.
10:   tau[dim]const ComplexInput
Note: the dimension, dim, of the array tau must be at least max1,minr,k.
On entry: further details of the elementary reflectors, as returned by nag_zgebrd (f08ksc) in its argument tauq if vect=Nag_ApplyQ, or in its argument taup if vect=Nag_ApplyP.
11:   c[dim]ComplexInput/Output
Note: the dimension, dim, of the array c must be at least
  • max1,pdc×n when order=Nag_ColMajor;
  • max1,m×pdc when order=Nag_RowMajor.
The i,jth element of the matrix C is stored in
  • c[j-1×pdc+i-1] when order=Nag_ColMajor;
  • c[i-1×pdc+j-1] when order=Nag_RowMajor.
On entry: the matrix C.
On exit: c is overwritten by QC or QHC or CQ or CHQ or PC or PHC or CP or CHP 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 order=Nag_ColMajor, pdcmax1,m;
  • if order=Nag_RowMajor, pdcmax1,n.
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.
NE_BAD_PARAM
On entry, argument value had an illegal value.
NE_ENUM_INT_2
On entry, vect=value, pda=value, k=value.
Constraint: if vect=Nag_ApplyQ, pda max1,minr,k ;
if vect=Nag_ApplyP, pdamax1,r.
On entry, vect=value, pda=value and k=value.
Constraint: if vect=Nag_ApplyQ, pda max1,r ;
if vect=Nag_ApplyP, pda max1,minr,k .
NE_INT
On entry, k=value.
Constraint: k0.
On entry, m=value.
Constraint: m0.
On entry, n=value.
Constraint: n0.
On entry, pda=value.
Constraint: pda>0.
On entry, pdc=value.
Constraint: pdc>0.
NE_INT_2
On entry, pdc=value and m=value.
Constraint: pdcmax1,m.
On entry, pdc=value and n=value.
Constraint: pdcmax1,n.
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 ε is the machine precision.

8  Further Comments

The total number of real floating point operations is approximately 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=QaR and then reduces the factor R to bidiagonal form B: R=QbBPH. Finally it forms Qa and calls nag_zunmbr (f08kuc) to form Q=QaQb.
In the second example, m<n, 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=LPaH and then reduces the factor L to bidiagonal form B: L=QBPbH. Finally it forms PbH and calls nag_zunmbr (f08kuc) to form PH=PbHPaH.

9.1  Program Text

Program Text (f08kuce.c)

9.2  Program Data

Program Data (f08kuce.d)

9.3  Program Results

Program Results (f08kuce.r)


nag_zunmbr (f08kuc) (PDF version)
f08 Chapter Contents
f08 Chapter Introduction
NAG C Library Manual

© The Numerical Algorithms Group Ltd, Oxford, UK. 2012