Multiplication of Q From QR Factorization#
UNMQR (UNitary matrix Multiplication after QR factorization) overwrites the general M x N
matrix C
with
\(op(Q) * C\) if
side = side::left
\(C * op(Q)\) if
side = side::right
where Q
is an unitary matrix from the QR factorization. Operation op(A)
indicates if Q
is non_transposed
, or transposed
for real data type, or conj_transposed
for complex data type.
Q
is of order M
if side = side::left
, and of order N
if side = side::right
.
cuSolverDx unmqr
device functions are (see Execution Methods):
__device__ void execute(const data_type* A, const data_type* tau, data_type* C);
// with runtime leading dimensions
__device__ void execute(const data_type* A, const unsigned int lda, const data_type* tau,
data_type* C);
__device__ void execute(const data_type* A, const data_type* tau,
data_type* C, const unsigned int ldc);
__device__ void execute(const data_type* A, const unsigned int lda, const data_type* tau,
data_type* C, const unsigned int ldc);
A
is a batched matrix coming from the output of the QR factorization. If side = side::left
, A
is M x K
with leading dimension lda >= M
if matrix A
is in column-major layout, or lda >= K
if matrix A
is row-major. If side = side::right
, A
is instead N x K
with leading dimension lda >= N
if matrix A
is in column-major layout, or lda >= K
if matrix A
is row-major.
Array tau
is an input array of size K
for each batch, coming from the output of the QR factorization.
If side = side::left
, then K
cannot be larger than M
. If side = side::right
, then K
cannot be larger than N
.
The elements below the diagonal of A
, with the array tau
, represent the matrix Q
as a product of a sequence of K
Householder vectors.
Matrix C
is an input and output matrix, having dimension of M x N
per batch. After the function, matrix C
is overwritten with the result of the multiplication.
The functions support:
A
andC
being either column- or row-major memory layout, see Arrangement Operator,\(op(Q)\) either being
non_transposed
,transposed
for real data type, orconj_transposed
for complex data type, see TransposeMode Operator, andSide
of multiplication being eitherside::left
orside::right
, see Side Operator.