nag_dormbr (f08kgc) (PDF version)
f08 Chapter Contents
f08 Chapter Introduction
NAG C Library Manual

NAG Library Function Document

nag_dormbr (f08kgc)

+ Contents

    1  Purpose
    7  Accuracy

1  Purpose

nag_dormbr (f08kgc) multiplies an arbitrary real m by n matrix C by one of the real orthogonal matrices Q or P which were determined by nag_dgebrd (f08kec) when reducing a real matrix to bidiagonal form.

2  Specification

#include <nag.h>
#include <nagf08.h>
void  nag_dormbr (Nag_OrderType order, Nag_VectType vect, Nag_SideType side, Nag_TransType trans, Integer m, Integer n, Integer k, const double a[], Integer pda, const double tau[], double c[], Integer pdc, NagError *fail)

3  Description

nag_dormbr (f08kgc) is intended to be used after a call to nag_dgebrd (f08kec), which reduces a real rectangular matrix A to bidiagonal form B by an orthogonal transformation: A=QBPT. nag_dgebrd (f08kec) represents the matrices Q and PT as products of elementary reflectors.
This function may be used to form one of the matrix products
QC , QTC , CQ , CQT , PC , PTC , CP ​ or ​ CPT ,
overwriting the result on C (which may be any real 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 PT: 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 QT or P or PT is to be applied to C.
vect=Nag_ApplyQ
Q or QT is applied to C.
vect=Nag_ApplyP
P or PT is applied to C.
Constraint: vect=Nag_ApplyQ or Nag_ApplyP.
3:     sideNag_SideTypeInput
On entry: indicates how Q or QT or P or PT is to be applied to C.
side=Nag_LeftSide
Q or QT or P or PT is applied to C from the left.
side=Nag_RightSide
Q or QT or P or PT 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 QT or PT is to be applied to C.
trans=Nag_NoTrans
Q or P is applied to C.
trans=Nag_Trans
QT or PT is applied to C.
Constraint: trans=Nag_NoTrans or Nag_Trans.
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 doubleInput
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_dgebrd (f08kec).
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 doubleInput
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_dgebrd (f08kec) in its argument tauq if vect=Nag_ApplyQ, or in its argument taup if vect=Nag_ApplyP.
11:   c[dim]doubleInput/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 QTC or CQ or CTQ or PC or PTC or CP or CTP 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 floating point operations is approximately where k is the value of the argument k.
The complex analogue of this function is nag_zunmbr (f08kuc).

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.57 -1.28 -0.39 0.25 -1.93 1.08 -0.31 -2.14 2.30 0.24 0.40 -0.35 -1.93 0.64 -0.66 0.08 0.15 0.30 0.15 -2.13 -0.02 1.03 -1.43 0.50 .
The function first performs a QR factorization of A as A=QaR and then reduces the factor R to bidiagonal form B: R=QbBPT. Finally it forms Qa and calls nag_dormbr (f08kgc) to form Q=QaQb.
In the second example, m<n, and
A = -5.42 3.28 -3.68 0.27 2.06 0.46 -1.65 -3.40 -3.20 -1.03 -4.06 -0.01 -0.37 2.35 1.90 4.31 -1.76 1.13 -3.15 -0.11 1.99 -2.70 0.26 4.50 .
The function first performs an LQ factorization of A as A=LPaT and then reduces the factor L to bidiagonal form B: L=QBPbT. Finally it forms PbT and calls nag_dormbr (f08kgc) to form PT=PbTPaT.

9.1  Program Text

Program Text (f08kgce.c)

9.2  Program Data

Program Data (f08kgce.d)

9.3  Program Results

Program Results (f08kgce.r)


nag_dormbr (f08kgc) (PDF version)
f08 Chapter Contents
f08 Chapter Introduction
NAG C Library Manual

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