Developer Reference for Intel® oneAPI Math Kernel Library for C

ID 766684
Date 3/22/2024
Public

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

Document Table of Contents

?unmbr

Multiplies an arbitrary complex matrix by the unitary matrix Q or P determined by ?gebrd.

Syntax

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

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

Include Files

  • mkl.h

Description

Given an arbitrary complex matrix C, this routine forms one of the matrix products Q*C, QH*C, C*Q, C*QH, P*C, PH*C, C*P, or C*PH, where Q and P are unitary matrices computed by a call to gebrd/gebrd. The routine overwrites the product on C.

Input Parameters

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

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 QH is applied to C.

If vect = 'P', then P or PH 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 'C'.

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

If trans = 'C', then QH or PH 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).

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, QH*C, C*Q, C*QH, P*C, PH*C, C*P, or C*PH, 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

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

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

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

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

The real counterpart of this routine is ormbr.