Developer Reference for Intel® oneAPI Math Kernel Library for C

ID 766684
Date 3/22/2024
Public
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.