unmbr(3)
β¨ unmbr(3) β¨ β {un,or}mbr: multiply by Q, P from gebrd π
πΈ NAME πΈ
unmbr β {un,or}mbr: multiply by Q, P from gebrd. That's the whole vibe, bestie: this is the family that applies Q or P (or their conjugate/transpose) from gebrd. π
π¦ SYNOPSIS π¦
β¨ Functions β¨
okay so here's the cast β four Fortran subroutines, same energy, different precision/type situation:
subroutine cunmbr (vect, side, trans, m, n, k, a, lda, tau, c, ldc,
work, lwork, info)
CUNMBR
subroutine dormbr (vect, side, trans, m, n, k, a, lda, tau, c, ldc,
work, lwork, info)
DORMBR
subroutine sormbr (vect, side, trans, m, n, k, a, lda, tau, c, ldc,
work, lwork, info)
SORMBR
subroutine zunmbr (vect, side, trans, m, n, k, a, lda, tau, c, ldc,
work, lwork, info)
ZUNMBR
π¦ Detailed Description π¦
No extra prose here in the source β just the heading. The real main-character energy starts under Function Documentation. π
π Function Documentation π
π subroutine cunmbr π
subroutine cunmbr (character vect, 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)
CUNMBR
β¨ Purpose: β¨
If VECT = 'Q', CUNMBR overwrites the general complex M-by-N matrix C with this whole grid, no cap:
SIDE = 'L' SIDE = 'R'
TRANS = 'N': Q * C C * Q
TRANS = 'C': Q**H * C C * Q**H
If VECT = 'P', CUNMBR overwrites the general complex M-by-N matrix C with:
SIDE = 'L' SIDE = 'R'
TRANS = 'N': P * C C * P
TRANS = 'C': P**H * C C * P**H
Here's the lore: Q and P**H are the unitary matrices determined by CGEBRD when reducing a complex matrix A to bidiagonal form: A = Q * B * P**H. Q and P**H are defined as products of elementary reflectors H(i) and G(i) respectively. π«Ά
Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the order of the unitary matrix Q or P**H that is applied.
If VECT = 'Q', A is assumed to have been an NQ-by-K matrix:
- if
nq >= k,Q = H(1) H(2) . . . H(k); - if
nq < k,Q = H(1) H(2) . . . H(nq-1).
If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
- if
k < nq,P = G(1) G(2) . . . G(k); - if
k >= nq,P = G(1) G(2) . . . G(nq-1).
π Parameters π
VECTβVECT is CHARACTER*1.= 'Q': apply Q or QH;= 'P': apply P or PH. πSIDEβSIDE is CHARACTER*1.= 'L': apply Q, QH, P or PH from the Left;= 'R': apply Q, QH, P or PH from the Right.TRANSβTRANS is CHARACTER*1.= 'N': No transpose, apply Q or P;= 'C': Conjugate transpose, apply QH or PH.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. IfVECT = 'Q', the number of columns in the original matrix reduced byCGEBRD. IfVECT = 'P', the number of rows in the original matrix reduced byCGEBRD.K >= 0.AβA is COMPLEX array, dimension(LDA,min(nq,K)) if VECT = 'Q';(LDA,nq) if VECT = 'P'. The vectors which define the elementary reflectorsH(i)andG(i), whose products determine the matricesQandP, as returned byCGEBRD.LDAβLDA is INTEGER. The leading dimension of the array A. IfVECT = 'Q',LDA >= max(1,nq); ifVECT = 'P',LDA >= max(1,min(nq,K)).TAUβTAU is COMPLEX array, dimension (min(nq,K)).TAU(i)must contain the scalar factor of the elementary reflectorH(i)orG(i)which determinesQorP, as returned byCGEBRDin the array argumentTAUQorTAUP.CβC is COMPLEX array, dimension (LDC,N). On entry, theM-by-NmatrixC. On exit,Cis overwritten byQ*CorQ**H*CorC*Q**HorC*QorP*CorP**H*CorC*PorC*P**H.LDCβLDC is INTEGER. The leading dimension of the array C.LDC >= max(1,M).WORKβWORK is COMPLEX array, dimension (MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK.LWORKβLWORK is INTEGER. The dimension of the array WORK. IfSIDE = 'L',LWORK >= max(1,N); ifSIDE = 'R',LWORK >= max(1,M); ifN = 0orM = 0,LWORK >= 1. For optimum performanceLWORK >= max(1,N*NB)ifSIDE = 'L', andLWORK >= max(1,M*NB)ifSIDE = 'R', whereNBis the optimal blocksize. (NB = 0ifM = 0orN = 0.) 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βINFO is INTEGER.= 0: successful exit.< 0: ifINFO = -i, thei-th argument had an illegal value.
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 195 of file cunmbr.f.
π subroutine dormbr π
subroutine dormbr (character vect, 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)
DORMBR
β¨ Purpose: β¨
If VECT = 'Q', DORMBR 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
If VECT = 'P', DORMBR overwrites the general real M-by-N matrix C with:
SIDE = 'L' SIDE = 'R'
TRANS = 'N': P * C C * P
TRANS = 'T': P**T * C C * P**T
Here's the real-precision lore: Q and P**T are the orthogonal matrices determined by DGEBRD when reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and P**T are defined as products of elementary reflectors H(i) and G(i) respectively. π«Ά
Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the order of the orthogonal matrix Q or P**T that is applied.
If VECT = 'Q', A is assumed to have been an NQ-by-K matrix:
- if
nq >= k,Q = H(1) H(2) . . . H(k); - if
nq < k,Q = H(1) H(2) . . . H(nq-1).
If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
- if
k < nq,P = G(1) G(2) . . . G(k); - if
k >= nq,P = G(1) G(2) . . . G(nq-1).
π Parameters π
VECTβVECT is CHARACTER*1.= 'Q': apply Q or QT;= 'P': apply P or PT.SIDEβSIDE is CHARACTER*1.= 'L': apply Q, QT, P or PT from the Left;= 'R': apply Q, QT, P or PT from the Right.TRANSβTRANS is CHARACTER*1.= 'N': No transpose, apply Q or P;= 'T': Transpose, apply QT or PT.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. IfVECT = 'Q', the number of columns in the original matrix reduced byDGEBRD. IfVECT = 'P', the number of rows in the original matrix reduced byDGEBRD.K >= 0.AβA is DOUBLE PRECISION array, dimension(LDA,min(nq,K)) if VECT = 'Q';(LDA,nq) if VECT = 'P'. The vectors which define the elementary reflectorsH(i)andG(i), whose products determine the matricesQandP, as returned byDGEBRD.LDAβLDA is INTEGER. The leading dimension of the array A. IfVECT = 'Q',LDA >= max(1,nq); ifVECT = 'P',LDA >= max(1,min(nq,K)).TAUβTAU is DOUBLE PRECISION array, dimension (min(nq,K)).TAU(i)must contain the scalar factor of the elementary reflectorH(i)orG(i)which determinesQorP, as returned byDGEBRDin the array argumentTAUQorTAUP.CβC is DOUBLE PRECISION array, dimension (LDC,N). On entry, theM-by-NmatrixC. On exit,Cis overwritten byQ*CorQ**T*CorC*Q**TorC*QorP*CorP**T*CorC*PorC*P**T.LDCβLDC is INTEGER. The leading dimension of the array C.LDC >= max(1,M).WORKβWORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK.LWORKLWORKβ okay bestie, this is anINTEGERand it's the dimension of the arrayWORK. So:- if
SIDE = 'L', thenLWORK >= max(1,N); - if
SIDE = 'R', thenLWORK >= max(1,M).
- if
And for optimum performance (like, when you want it to slay and not crawl): LWORK >= N*NB if SIDE = 'L', and LWORK >= M*NB if SIDE = 'R', where NB is the optimal blocksize. β¨
π«Ά Big one, don't skip it: 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β anINTEGER, the little status report at the end, and it goes like this:= 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 193 of file dormbr.f.
π¦ subroutine sormbr π¦
Here's the signature, and yes, keep it exactly as-is:
subroutine sormbr (character vect, 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)
SORMBR β the single-precision real one, the sibling of the routine above. Same energy, real numbers. π
πΈ Purpose πΈ
If VECT = 'Q', SORMBR 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
If VECT = 'P', SORMBR overwrites the general real M-by-N matrix C with:
SIDE = 'L' SIDE = 'R'
TRANS = 'N': P * C C * P
TRANS = 'T': P**T * C C * P**T
Here Q and P**T are the orthogonal matrices determined by SGEBRD when reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and P**T are defined as products of elementary reflectors H(i) and G(i) respectively. π§
Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the order of the orthogonal matrix Q or P**T that is applied. β
If VECT = 'Q', A is assumed to have been an NQ-by-K matrix:
- if
nq >= k,Q = H(1) H(2) . . . H(k); - if
nq < k,Q = H(1) H(2) . . . H(nq-1).
If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
- if
k < nq,P = G(1) G(2) . . . G(k); - if
k >= nq,P = G(1) G(2) . . . G(nq-1).
π Parameters π
VECTβVECTisCHARACTER*1, and it's literally just which matrix you're working with:= 'Q': applyQorQ**T;= 'P': applyPorP**T.
SIDEβSIDEisCHARACTER*1, and it picks the side, obvi:= 'L': applyQ,Q**T,PorP**Tfrom the Left;= 'R': applyQ,Q**T,PorP**Tfrom the Right.
TRANSβTRANSisCHARACTER*1:= 'N': No transpose, applyQorP;= 'T': Transpose, applyQ**TorP**T.
MβMisINTEGER, the number of rows of the matrixC.M >= 0.NβNisINTEGER, the number of columns of the matrixC.N >= 0.KβKisINTEGER:- If
VECT = 'Q', the number of columns in the original matrix reduced bySGEBRD. - If
VECT = 'P', the number of rows in the original matrix reduced bySGEBRD. K >= 0. π
- If
AβAisREALarray, dimension(LDA,min(nq,K))ifVECT = 'Q'(LDA,nq)ifVECT = 'P'
The vectors which define the elementary reflectors H(i) and G(i), whose products determine the matrices Q and P, as returned by SGEBRD.
LDAβLDAisINTEGER, the leading dimension of the arrayA.- If
VECT = 'Q',LDA >= max(1,nq); - if
VECT = 'P',LDA >= max(1,min(nq,K)).
- If
TAUβTAUisREALarray, dimension(min(nq,K)).TAU(i)must contain the scalar factor of the elementary reflectorH(i)orG(i)which determinesQorP, as returned bySGEBRDin the array argumentTAUQorTAUP. πCβCisREALarray, dimension(LDC,N).- On entry, the
M-by-NmatrixC. - On exit,
Cis overwritten byQ*CorQ**T*CorC*Q**TorC*QorP*CorP**T*CorC*PorC*P**T. π (rip your originalC, she's gone, that's the whole point)
- On entry, the
LDCβLDCisINTEGER, the leading dimension of the arrayC.LDC >= max(1,M).WORKβWORKisREALarray, dimension(MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK. π«ΆLWORKβLWORKisINTEGER, the dimension of the arrayWORK.- If
SIDE = 'L',LWORK >= max(1,N); - if
SIDE = 'R',LWORK >= max(1,M). - For optimum performance
LWORK >= N*NBifSIDE = 'L', andLWORK >= M*NBifSIDE = 'R', whereNBis the optimal blocksize.
- If
Same deal as before, no cap: 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 194 of file sormbr.f.
π subroutine zunmbr π
Signature time, verbatim bestie:
subroutine zunmbr (character vect, 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)
ZUNMBR β the double complex, double precision one. Different letters, same iconic behaviour. π
π§ Purpose π§
If VECT = 'Q', ZUNMBR 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
If VECT = 'P', ZUNMBR overwrites the general complex M-by-N matrix C with:
SIDE = 'L' SIDE = 'R'
TRANS = 'N': P * C C * P
TRANS = 'C': P**H * C C * P**H
Here Q and P**H are the unitary matrices determined by ZGEBRD when reducing a complex matrix A to bidiagonal form: A = Q * B * P**H. Q and P**H are defined as products of elementary reflectors H(i) and G(i) respectively. π¦
Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the order of the unitary matrix Q or P**H that is applied. β
If VECT = 'Q', A is assumed to have been an NQ-by-K matrix:
- if
nq >= k,Q = H(1) H(2) . . . H(k); - if
nq < k,Q = H(1) H(2) . . . H(nq-1).
If VECT = 'P', A is assumed to have been a K-by-NQ matrix:
- if
k < nq,P = G(1) G(2) . . . G(k); - if
k >= nq,P = G(1) G(2) . . . G(nq-1).
β¨ Parameters β¨
VECTβVECTisCHARACTER*1:= 'Q': applyQorQ**H;= 'P': applyPorP**H.
SIDEβSIDEisCHARACTER*1:= 'L': applyQ,Q**H,PorP**Hfrom the Left;= 'R': applyQ,Q**H,PorP**Hfrom the Right.
TRANSβTRANSisCHARACTER*1. Note it's a'C'here, not a'T', complex bestie, conjugate transpose is the moment:= 'N': No transpose, applyQorP;= 'C': Conjugate transpose, applyQ**HorP**H.
MβMisINTEGER, the number of rows of the matrixC.M >= 0.NβNisINTEGER, the number of columns of the matrixC.N >= 0.KβKisINTEGER:- If
VECT = 'Q', the number of columns in the original matrix reduced byZGEBRD. - If
VECT = 'P', the number of rows in the original matrix reduced byZGEBRD. K >= 0.
- If
AβAisCOMPLEX*16array, dimension(LDA,min(nq,K))ifVECT = 'Q'(LDA,nq)ifVECT = 'P'
The vectors which define the elementary reflectors H(i) and G(i), whose products determine the matrices Q and P, as returned by ZGEBRD. π
LDAβLDAisINTEGER, the leading dimension of the arrayA.- If
VECT = 'Q',LDA >= max(1,nq); - if
VECT = 'P',LDA >= max(1,min(nq,K)).
- If
TAUβTAUisCOMPLEX*16array, dimension(min(nq,K)).TAU(i)must contain the scalar factor of the elementary reflectorH(i)orG(i)which determinesQorP, as returned byZGEBRDin the array argumentTAUQorTAUP. πCβCisCOMPLEX*16array, dimension(LDC,N).- On entry, the
M-by-NmatrixC. - On exit,
Cis overwritten byQ*CorQ**H*CorC*Q**HorC*QorP*CorP**H*CorC*PorC*P**H. π she's been replaced, respectfully
- On entry, the
LDCβLDCisINTEGER, the leading dimension of the arrayC.LDC >= max(1,M).WORKβWORKisCOMPLEX*16array, dimension(MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK. π«ΆLWORKβ and the workspace size is literally the very next thing, stay with me π
Okay so we're still in the parameter docs, and this part is giving workspace math + error-code clarity π β¨
LWORKβINTEGER, bestie. It's the dimension of the arrayWORK. Here's the strict tea:- If
SIDE = 'L',LWORK >= max(1,N). - If
SIDE = 'R',LWORK >= max(1,M). - If
N = 0orM = 0,LWORK >= 1. - For optimum performance,
LWORK >= max(1,N*NB)ifSIDE = 'L', andLWORK >= max(1,M*NB)ifSIDE = 'R', whereNBis the optimal blocksize. (NB = 0ifM = 0orN = 0.) - If
LWORK = -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.
- If
INFOβINTEGER, obviously.= 0: successful exit.< 0: ifINFO = -i, the i-th argument had an illegal value. Illegal value means exactly that, no sugarcoating π¨
Author π«Ά
These legends are on the credits, no cap:
Univ. of TennesseeUniv. of California BerkeleyUniv. of Colorado DenverNAG Ltd.
Definition at line 194 of file zunmbr.f.
Author π
Generated automatically by Doxygen for LAPACK from the source code.
Wrapped with love from LAPACK, Version 3.12.0, unmbr(3) β source and version secured, and this footer doesn't stamp a date, so we're not inventing one, bestie πβ¨π
π¦ 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