ZLAMSWLQ(3)
π NAME
Okay bestie, so this whole page is literally about the file /home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/zlamswlq.f β that's the whole name section, yes really, and it comes from Library Functions Manual. It's a LAPACK thing. Stay with me, it slays. β¨
πΈ SYNOPSIS πΈ
Functions/Subroutines
subroutine ZLAMSWLQ (side, trans, m, n, k, mb, nb, a, lda, t, ldt, c,
ldc, work, lwork, info)
That's the whole call, and yes its name is ZLAMSWLQ β say it with your chest. π
π¦ Function/Subroutine Documentation
Here's the full signature in all its glory, no cap:
subroutine ZLAMSWLQ (character side, character trans, integer m, integer n,
integer k, integer mb, integer nb, complex*16, dimension( lda, * ) a,
integer lda, complex*16, dimension( ldt, * ) t, integer ldt, complex*16,
dimension(ldc, * ) c, integer ldc, complex*16, dimension( * ) work,
integer lwork, integer info)
β¨ Purpose β¨
So what does it do? It overwrites the general complex M-by-N matrix C with:
SIDE = 'L' SIDE = 'R'
TRANS = 'N': Q * C C * Q
TRANS = 'C': Q**H * C C * Q**H
where Q is a complex unitary matrix defined as the product of blocked elementary reflectors computed by short wide LQ factorization (ZLASWLQ). It's giving matrix glow-up, honestly. π§
π Parameters π
SIDE
SIDE is CHARACTER*1
= 'L': apply Q orQ**Hfrom the Left;= 'R': apply Q orQ**Hfrom the Right.
Pick a side, any side. π
TRANS
TRANS is CHARACTER*1
= 'N': No transpose, apply Q;= 'C': Conjugate Transpose, applyQ**H.
M
M is INTEGER The number of rows of the matrix C. M >= 0.
N
N is INTEGER The number of columns of the matrix C. N >= 0.
K
K is INTEGER The number of elementary reflectors whose product defines the matrix Q.
M >= K >= 0;
(That's the constraint, fr fr β don't fight it. π)
MB
MB is INTEGER The row block size to be used in the blocked LQ.
M >= MB >= 1
NB
NB is INTEGER The column block size to be used in the blocked LQ.
NB > M.
Note the strictness β it's > not >=. Lowkey shady but okay. π
A
A is COMPLEX*16 array, dimension (LDA,M) if SIDE = 'L', (LDA,N) if SIDE = 'R'
The i-th row must contain the vector which defines the blocked elementary reflector H(i), for i = 1,2,...,k, as returned by ZLASWLQ in the first k rows of its array argument A.
LDA
LDA is INTEGER The leading dimension of the array A. LDA >= MAX(1,K).
T
T is COMPLEX*16 array, dimension ( M * Number of blocks(CEIL(N-K/NB-K)),
The blocked upper triangular block reflectors stored in compact form as a sequence of upper triangular blocks. See below for further details. π«Ά
Heads up bestie β yes, that dimension expression is exactly as written, parentheses and all. Copy it character for character, do not "fix" it, I'm begging. π
LDT
LDT is INTEGER The leading dimension of the array T. LDT >= MB.
C
C is COMPLEX*16 array, dimension (LDC,N) On entry, the M-by-N matrix C. On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
It goes in one vibe and comes out a whole different vibe. Main character transformation. β¨
LDC
LDC is INTEGER The leading dimension of the array C. LDC >= max(1,M).
WORK
(workspace) COMPLEX*16 array, dimension (MAX(1,LWORK))
LWORK
LWORK is INTEGER The dimension of the array WORK.
- If
SIDE = 'L',LWORK >= max(1,NB) * MB; - if
SIDE = 'R',LWORK >= max(1,M) * MB.
If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA.
The LWORK = -1 thing is the "just tell me how much room I need, don't actually do anything" move. Very demure. Very mindful. π
INFO
INFO is INTEGER
= 0: successful exit< 0: ifINFO = -i, the i-th argument had an illegal value
We love a zero. Zero is the slay. Anything negative means somebody passed a bad argument. π
π Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π₯ Further Details:
Short-Wide LQ (SWLQ) performs LQ by a sequence of unitary transformations, representing Q as a product of other unitary matrices
Q = Q(1) * Q(2) * . . . * Q(k)
where each Q(i) zeros out upper diagonal entries of a block of NB rows of A:
Q(1) zeros out the upper diagonal entries of rows 1:NB of A
Q(2) zeros out the bottom MB-N rows of rows [1:M,NB+1:2*NB-M] of A
Q(3) zeros out the bottom MB-N rows of rows [1:M,2*NB-M+1:3*NB-2*M] of A
. . .
Q(1) is computed by GELQT, which represents Q(1) by Householder vectors stored under the diagonal of rows 1:MB of A, and by upper triangular block reflectors, stored in array T(1:LDT,1:N). For more information see Further Details in GELQT.
Q(i) for i>1 is computed by TPLQT, which represents Q(i) by Householder vectors stored in columns [(i-1)*(NB-M)+M+1:i*(NB-M)+M] of A, and by upper triangular block reflectors, stored in array T(1:LDT,(i-1)*M+1:i*M). The last Q(k) may use fewer rows. For more information see Further Details in TPLQT.
For more details of the overall algorithm, see the description of Sequential TSQR in Section 2.2 of [1].
[1] "Communication-Optimal Parallel and Sequential QR and LU Factorizations," J. Demmel, L. Grigori, M. Hoemmen, J. Langou, SIAM J. Sci. Comput, vol. 34, no. 1, 2012
π Definition
Definition at line 195 of file zlamswlq.f.
π Author
Generated automatically by Doxygen for LAPACK from the source code. (Not a human, just a robot doing its little robot thing. Respect. π€)
Okay that's the whole page bestie, you ate that π«Ά β this masterpiece is shipped as LAPACK, Version 3.12.0, and it lives at /home/abui.../zlamswlq.f(3). Go forth and factorize. ππΈ
π¦ where this page comes from
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms