Developer Reference for Intel® oneAPI Math Kernel Library for C

ID 766684
Date 11/07/2023
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of Contents

?ormbr

Multiplies an arbitrary real matrix by the real orthogonal matrix Q or PT determined by ?gebrd.

Syntax

lapack_int LAPACKE_sormbr (int matrix_layout, char vect, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);

lapack_int LAPACKE_dormbr (int matrix_layout, char vect, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc);

Include Files

  • mkl.h

Description

Given an arbitrary real matrix C, this routine forms one of the matrix products Q*C, QT*C, C*Q, C*QT, P*C, PT*C, C*P, C*PT, where Q and P are orthogonal matrices computed by a call to gebrd. The routine overwrites the product on C.

Input Parameters

In the descriptions below, r denotes the order of Q or PT:

If side = 'L', r = m; if side = 'R', r = n.

matrix_layout

Specifies whether matrix storage layout is row major (LAPACK_ROW_MAJOR) or column major (LAPACK_COL_MAJOR).

vect

Must be 'Q' or 'P'.

If vect = 'Q', then Q or QT is applied to C.

If vect = 'P', then P or PT is applied to C.

side

Must be 'L' or 'R'.

If side = 'L', multipliers are applied to C from the left.

If side = 'R', they are applied to C from the right.

trans

Must be 'N' or 'T'.

If trans = 'N', then Q or P is applied to C.

If trans = 'T', then QT or PT is applied to C.

m

The number of rows in C.

n

The number of columns in C.

k

One of the dimensions of A in ?gebrd:

If vect = 'Q', the number of columns in A;

If vect = 'P', the number of rows in A.

Constraints: m 0, n 0, k 0.

a, c

Arrays:

a is the array a as returned by ?gebrd.

The size of a depends on the value of the matrix_layout, vect, and side parameters:

matrix_layout vect side size

column major

'Q'

-

max(1, lda*k)

column major

'P'

'L'

max(1, lda*m)

column major

'P'

'R'

max(1, lda*n)

row major

'Q'

'L'

max(1, lda*m)

row major

'Q'

'R'

max(1, lda*n)

row major

'P'

-

max(1, lda*k)

c(size max(1, ldc*n) for column major layout and max(1, ldc*m) for row major layout) holds the matrix C.

lda

The leading dimension of a. Constraints:

lda max(1, r) for column major layout and at least max(1, k) for row major layout if vect = 'Q';

lda max(1, min(r,k)) for column major layout and at least max(1, r) for row major layout if vect = 'P'.

ldc

The leading dimension of c; ldc max(1, m) for column major layout and ldc max(1, n) for row major layout .

tau

Array, size at least max (1, min(r, k)).

For vect = 'Q', the array tauq as returned by ?gebrd. For vect = 'P', the array taup as returned by ?gebrd.

Output Parameters

c

Overwritten by the product Q*C, QT*C, C*Q, C*Q,T, P*C, PT*C, C*P, or C*PT, as specified by vect, side, and trans.

Return Values

This function returns a value info.

If info=0, the execution is successful.

If info = -i, the i-th parameter had an illegal value.

Application Notes

The computed product differs from the exact product by a matrix E such that ||E||2 = O(ε)*||C||2.

The total number of floating-point operations is approximately

2*n*k(2*m - k) if side = 'L' and mk;

2*m*k(2*n - k) if side = 'R' and nk;

2*m2*n if side = 'L' and m < k;

2*n2*m if side = 'R' and n < k.

The complex counterpart of this routine is unmbr.