unmql(3)
πΈ unmql(3) β the bestie edit πΈ
okay so this is unmql from the Library Functions Manual, and no bc it's not one function, it's a whole little squad: {un,or}mql β multiply by Q from geqlf. literally the glow-up crew for your matrix. π
π NAME π
unmql β {un,or}mql: multiply by Q from geqlf
like. that's the whole vibe. multiply by Q, and Q came from geqlf. periodt. β¨
π SYNOPSIS π
π«Ά Functions
subroutine cunmql (side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)βCUNMQLsubroutine dormql (side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)βDORMQLsubroutine sormql (side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)βSORMQLsubroutine zumql (side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)βZUNMQL
four icons, four precision flavours. pick your fave, they all do the same dance πΊ
π¦ Detailed Description π¦
bestie this is the part where the manpage just kinda goes "Detailed Description" and then immediately starts documenting the functions. no extra lore, no lore drop. the lore is the functions. main character energy honestly. π
π Function Documentation π
π cunmql β the complex one, she's iconic
subroutine cunmql (character side, character trans, integer m, integer n,
integer k, complex, dimension( lda, * ) a, integer lda, complex,
dimension( * ) tau, complex, dimension( ldc, * ) c, integer ldc,
complex, dimension( * ) work, integer lwork, integer info)
β Purpose
okay so CUNMQL 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 k elementary reflectors
Q = H(k) . . . H(2) H(1)
as returned by CGEQLF. Q is of order M if SIDE = 'L' and of order N if SIDE = 'R'. π¦
π Parameters
SIDEβSIDEisCHARACTER*1= 'L': apply Q or Q**H from the Left;= 'R': apply Q or Q**H from the Right.
TRANSβTRANSisCHARACTER*1= 'N': No transpose, apply Q;= 'C': Conjugate transpose, apply Q**H.
MβMisINTEGER. The number of rows of the matrix C.M >= 0.NβNisINTEGER. The number of columns of the matrix C.N >= 0.KβKisINTEGER. The number of elementary reflectors whose product defines the matrix Q. IfSIDE = 'L',M >= K >= 0; ifSIDE = 'R',N >= K >= 0.AβAisCOMPLEXarray, dimension(LDA,K). The i-th column must contain the vector which defines the elementary reflector H(i), fori = 1,2,...,k, as returned byCGEQLFin the last k columns of its array argument A. πLDAβLDAisINTEGER. The leading dimension of the array A. IfSIDE = 'L',LDA >= max(1,M); ifSIDE = 'R',LDA >= max(1,N).TAUβTAUisCOMPLEXarray, dimension(K).TAU(i)must contain the scalar factor of the elementary reflector H(i), as returned byCGEQLF.CβCisCOMPLEXarray, dimension(LDC,N). On entry, the M-by-N matrix C. On exit, C is overwritten byQ*CorQ**H*CorC*Q**HorC*Q. she gets rewritten, ok, that's her journey πLDCβLDCisINTEGER. The leading dimension of the array C.LDC >= max(1,M).WORKβWORKisCOMPLEXarray, dimension(MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK. πLWORKβLWORKisINTEGER. The dimension of the arrayWORK. IfSIDE = 'L',LWORK >= max(1,N); ifSIDE = 'R',LWORK >= max(1,M). For good performance,LWORKshould generally be larger. π
IfLWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of theWORKarray, returns this value as the first entry of theWORKarray, and no error message related toLWORKis issued byXERBLA. (so like,-1is not a crime here, it's a vibe check β¨)
INFOβINFOisINTEGER= 0: successful exit< 0: ifINFO = -i, the i-th argument had an illegal value
π§ Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Definition at line 166 of file cunmql.f.
πΈ dormql β double precision, double the slay
subroutine dormql (character side, character trans, integer m, integer n,
integer k, double precision, dimension( lda, * ) a, integer lda, double
precision, dimension( * ) tau, double precision, dimension( ldc, * ) c,
integer ldc, double precision, dimension( * ) work, integer lwork,
integer info)
β Purpose
DORMQL overwrites the general real M-by-N matrix C with:
SIDE = 'L' SIDE = 'R'
TRANS = 'N': Q * C C * Q
TRANS = 'T': Q**T * C C * Q**T
where Q is a real orthogonal matrix defined as the product of k elementary reflectors
Q = H(k) . . . H(2) H(1)
as returned by DGEQLF. Q is of order M if SIDE = 'L' and of order N if SIDE = 'R'. π«Ά
π Parameters
SIDEβSIDEisCHARACTER*1= 'L': apply Q or Q**T from the Left;= 'R': apply Q or Q**T from the Right.
TRANSβTRANSisCHARACTER*1= 'N': No transpose, apply Q;= 'T': Transpose, apply Q**T.
MβMisINTEGER. The number of rows of the matrix C.M >= 0.NβNisINTEGER. The number of columns of the matrix C.N >= 0.KβKisINTEGER. The number of elementary reflectors whose product defines the matrix Q. IfSIDE = 'L',M >= K >= 0; ifSIDE = 'R',N >= K >= 0.AβAisDOUBLE PRECISIONarray, dimension(LDA,K). The i-th column must contain the vector which defines the elementary reflector H(i), fori = 1,2,...,k, as returned byDGEQLFin the last k columns of its array argument A.LDAβLDAisINTEGER. The leading dimension of the array A. IfSIDE = 'L',LDA >= max(1,M); ifSIDE = 'R',LDA >= max(1,N).TAUβTAUisDOUBLE PRECISIONarray, dimension(K).TAU(i)must contain the scalar factor of the elementary reflector H(i), as returned byDGEQLF.CβCisDOUBLE PRECISIONarray, dimension(LDC,N). On entry, the M-by-N matrix C. On exit, C is overwritten byQ*CorQ**T*CorC*Q**TorC*Q.LDCβLDCisINTEGER. The leading dimension of the array C.LDC >= max(1,M).WORKβWORKisDOUBLE PRECISIONarray, dimension(MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK.LWORKβLWORKisINTEGER. The dimension of the arrayWORK. IfSIDE = 'L',LWORK >= max(1,N); ifSIDE = 'R',LWORK >= max(1,M). For good performance,LWORKshould generally be larger.
IfLWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of theWORKarray, returns this value as the first entry of theWORKarray, and no error message related toLWORKis issued byXERBLA.
INFOβINFOisINTEGER= 0: successful exit< 0: ifINFO = -i, the i-th argument had an illegal value
π§ Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Definition at line 165 of file dormql.f.
π sormql β single precision, still eating
subroutine sormql (character side, character trans, integer m, integer n,
integer k, real, dimension( lda, * ) a, integer lda, real, dimension( * )
tau, real, dimension( ldc, * ) c, integer ldc, real, dimension( * )
work, integer lwork, integer info)
β Purpose
SORMQL overwrites the general real M-by-N matrix C with:
SIDE = 'L' SIDE = 'R'
TRANS = 'N': Q * C C * Q
TRANS = 'T': Q**T * C C * Q**T
where Q is a real orthogonal matrix defined as the product of k elementary reflectors
Q = H(k) . . . H(2) H(1)
as returned by SGEQLF. Q is of order M if SIDE = 'L' and of order N if SIDE = 'R'. π₯
π Parameters
SIDEβSIDEisCHARACTER*1= 'L': apply Q or Q**T from the Left;= 'R': apply Q or Q**T from the Right.
TRANSβTRANSisCHARACTER*1= 'N': No transpose, apply Q;= 'T': Transpose, apply Q**T.
MβMisINTEGER. The number of rows of the matrix C.M >= 0.NβNisINTEGER. The number of columns of the matrix C.N >= 0.KβKisINTEGER. The number of elementary reflectors whose product defines the matrix Q. IfSIDE = 'L',M >= K >= 0; ifSIDE = 'R',N >= K >= 0.AβAisREALarray, dimension(LDA,K). The i-th column must contain the vector which defines the elementary reflector H(i), fori = 1,2,...,k, as returned bySGEQLFin the last k columns of its array argument A.LDAβLDAisINTEGER. The leading dimension of the array A. IfSIDE = 'L',LDA >= max(1,M); ifSIDE = 'R',LDA >= max(1,N).TAUβTAUisREALarray, dimension(K).TAU(i)must contain the scalar factor of the elementary reflector H(i), as returned bySGEQLF.C
π okay bestie, that's exactly where part 1 cuts off β C's full description is coming up in part 2, and honestly there's so much more to come. stay tuned, no cap. π
Cβ aREALarray, dimension(LDC,N). On entry it's your M-by-N matrix C, and on exit C gets overwritten byQ*CorQ**T*CorC*Q**TorC*Qπ (which one depends onSIDEandTRANS, and yes bestie those four are a whole mood)LDCβINTEGER, the leading dimension of the arrayC. Rule to live by:LDC >= max(1,M). No exceptions, no vibes-based math, periodt πWORKβ aREALarray, dimension(MAX(1,LWORK)). On exit, ifINFO = 0, thenWORK(1)returns the optimalLWORK. She's giving helpful bestie energy β¨LWORKβINTEGER, the dimension of the arrayWORK.- If
SIDE = 'L',LWORK >= max(1,N); - if
SIDE = 'R',LWORK >= max(1,M). - For good performance,
LWORKshould generally be larger. (Bigger workspace = happier routine, fr fr π«Ά)
- If
Also important: if LWORK = -1, then a workspace query is assumed. The routine then only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and β this is the slay part β no error message related to LWORK is issued by XERBLA π
INFOβINTEGER.= 0: successful exit π< 0: ifINFO = -i, the i-th argument had an illegal value π (so like, check your args)
πΈ Author πΈ
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 166 of file sormql.f.
π zunmql β the complex one, and honestly she ate π
subroutine zunmql (character side, character trans, integer m, integer n,
integer k, complex*16, dimension( lda, * ) a, integer lda, complex*16,
dimension( * ) tau, complex*16, dimension( ldc, * ) c, integer ldc,
complex*16, dimension( * ) work, integer lwork, integer info)
β¨ ZUNMQL β¨
Purpose
Okay so here's the whole point of her: ZUNMQL 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 k elementary reflectors
Q = H(k) . . . H(2) H(1)
as returned by ZGEQLF. And Q is of order M if SIDE = 'L' and of order N if SIDE = 'R'. That's it, that's the whole plot π¦
Parameters
SIDEβCHARACTER*1.= 'L': applyQorQ**Hfrom the Left;= 'R': applyQorQ**Hfrom the Right. π«Ά
TRANSβCHARACTER*1.= 'N': No transpose, applyQ;= 'C': Conjugate transpose, applyQ**H. π
MβINTEGER, the number of rows of the matrixC. Requirement:M >= 0. (Zero is allowed, we don't judge π)NβINTEGER, the number of columns of the matrixC. Requirement:N >= 0.KβINTEGER, the number of elementary reflectors whose product defines the matrixQ.- If
SIDE = 'L',M >= K >= 0; - if
SIDE = 'R',N >= K >= 0. π
- If
AβCOMPLEX*16array, dimension(LDA,K). The i-th column must contain the vector which defines the elementary reflectorH(i), fori = 1,2,...,k, as returned byZGEQLFin the last k columns of its array argumentA. Literally the exact same object, no cap βLDAβINTEGER, the leading dimension of the arrayA.- If
SIDE = 'L',LDA >= max(1,M); - if
SIDE = 'R',LDA >= max(1,N). Respect the leading dimension, she's not optional π€
- If
TAUβCOMPLEX*16array, dimension(K).TAU(i)must contain the scalar factor of the elementary reflectorH(i), as returned byZGEQLF. That's her iconic little scalar β¨CβCOMPLEX*16array, dimension(LDC,N). On entry, the M-by-N matrixC. On exit,Cis overwritten byQ*CorQ**H*CorC*Q**HorC*Q. Choose your fighter based onSIDEandTRANSπLDCβINTEGER, the leading dimension of the arrayC. Requirement:LDC >= max(1,M). Say it with me:max(1,M). π―WORKβCOMPLEX*16array, dimension(MAX(1,LWORK)). On exit, ifINFO = 0, thenWORK(1)returns the optimalLWORK. Very demure, very mindful π§LWORKβINTEGER, the dimension of the arrayWORK.- If
SIDE = 'L',LWORK >= max(1,N); - if
SIDE = 'R',LWORK >= max(1,M). - For good performance,
LWORKshould generally be larger. Give her room to breathe, bestie πΈ
- If
And again for the people in the back: 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. That's the whole deal, no cap π₯
INFOβINTEGER.= 0: successful exit π< 0: ifINFO = -i, the i-th argument had an illegal value. So likeβ¦ which one?-itells you exactly which one. Read it π
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 165 of file zunmql.f.
π Author (the meta one) π
Generated automatically by Doxygen for LAPACK from the source code.
Not me being auto-generated by Doxygen and still having more personality than half the codebase ππ
Okay that's the whole page bestie, go forth and multiply your unitaries, mwah π
With love from LAPACK, Version 3.12.0, and the unmql(3) page β no date in sight but she's timeless π¦β¨
π¦ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 Β· custom
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms