SRC/dormr2.f(3)
π SRC/dormr2.f
okay bestie, so this page is from the Library Functions Manual and it's literally all about one little subroutine β dormr2 β that lives in SRC/dormr2.f. yes it's Fortran. no we're not scared. let's go π
β¨ SYNOPSIS β¨
Functions/Subroutines π¦
subroutine dormr2 (side, trans, m, n, k, a, lda, tau, c, ldc, work, info)
DORMR2 multiplies a general matrix by the orthogonal matrix from a RQ factorization determined by sgerqf (unblocked algorithm). that's the whole vibe, no cap π₯
πΈ Function/Subroutine Documentation πΈ
subroutine dormr2 (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 info)
DORMR2 multiplies a general matrix by the orthogonal matrix from a RQ factorization determined by sgerqf (unblocked algorithm). like I said. iconic. π
π§ Purpose:
!> !> DORMR2 overwrites the general real m by n matrix C with !> !> Q * C if SIDE = 'L' and TRANS = 'N', or !> !> QT* C if SIDE = 'L' and TRANS = 'T', or !> !> C * Q if SIDE = 'R' and TRANS = 'N', or !> !> C * QT if SIDE = 'R' and TRANS = 'T', !> !> where Q is a real orthogonal matrix defined as the product of k !> elementary reflectors !> !> Q = H(1) H(2) . . . H(k) !> !> as returned by DGERQF. Q is of order m if SIDE = 'L' and of order n !> if SIDE = 'R'. !>
so basically C gets overwritten, bestie β the original C is gone, replaced by whichever of those four products your SIDE/TRANS combo picks. and Q is built out of these k elementary reflectors stacked up like Q = H(1) H(2) . . . H(k). Q is order m when SIDE = 'L', order n when SIDE = 'R'. keep up π
β¨ Parameters β¨
SIDEβ it's aCHARACTER*1, and it decides which side Q slides in from:
!> SIDE is CHARACTER*1 !> = 'L': apply Q or QT from the Left !> = 'R': apply Q or QT from the Right
TRANSβ alsoCHARACTER*1, the transpose vibe check:
!> TRANS is CHARACTER*1 !> = 'N': apply Q (No transpose) !> = 'T': apply Q' (Transpose)
MβINTEGER, the number of rows of the matrix C. andM >= 0, fr fr.
!> M is INTEGER !> The number of rows of the matrix C. M >= 0.
NβINTEGER, the number of columns of the matrix C.N >= 0. slay.
!> N is INTEGER !> The number of columns of the matrix C. N >= 0.
KβINTEGER, the number of elementary reflectors whose product defines the matrix Q. and listen: ifSIDE = 'L', thenM >= K >= 0; ifSIDE = 'R', thenN >= K >= 0. don't get it twisted π
!> K is INTEGER !> The number of elementary reflectors whose product defines !> the matrix Q. !> If SIDE = 'L', M >= K >= 0; !> if SIDE = 'R', N >= K >= 0.
Aβ aDOUBLE PRECISIONarray, dimension(LDA,M)ifSIDE = 'L',(LDA,N)ifSIDE = 'R'. the i-th row must contain the vector which defines the elementary reflectorH(i), fori = 1,2,...,k, as returned byDGERQFin the last k rows of its array argument A. also lowkey important: A is modified by the routine but restored on exit. so she's messy on the inside but comes back looking exactly the same π«Ά
!> A is DOUBLE PRECISION array, dimension !> (LDA,M) if SIDE = 'L', !> (LDA,N) if SIDE = 'R' !> The i-th row must contain the vector which defines the !> elementary reflector H(i), for i = 1,2,...,k, as returned by !> DGERQF in the last k rows of its array argument A. !> A is modified by the routine but restored on exit.
LDAβINTEGER, the leading dimension of the array A.LDA >= max(1,K). periodt.
!> LDA is INTEGER !> The leading dimension of the array A. LDA >= max(1,K).
TAUβDOUBLE PRECISIONarray, dimension(K).TAU(i)must contain the scalar factor of the elementary reflectorH(i), as returned byDGERQF. the little scalar besties that glue it all together π
!> TAU is DOUBLE PRECISION array, dimension (K) !> TAU(i) must contain the scalar factor of the elementary !> reflector H(i), as returned by DGERQF.
CβDOUBLE PRECISIONarray, dimension(LDC,N). on entry it's the m by n matrix C. on exit, C is overwritten byQ*CorQ**T*CorC*Q**TorC*Q. she's a changed woman π
!> C is DOUBLE PRECISION array, dimension (LDC,N) !> On entry, the m by n matrix C. !> On exit, C is overwritten by Q*C or QT*C or C*QT or C*Q.
LDCβINTEGER, the leading dimension of the array C.LDC >= max(1,M). don't forget it π€
!> LDC is INTEGER !> The leading dimension of the array C. LDC >= max(1,M).
WORKβDOUBLE PRECISIONarray, dimension(N)ifSIDE = 'L',(M)ifSIDE = 'R'. the scratch space. she works hard so you don't have to π
!> WORK is DOUBLE PRECISION array, dimension !> (N) if SIDE = 'L', !> (M) if SIDE = 'R'
INFOβINTEGER, the receipts:
!> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value
so 0 means we ate and left no crumbs, and a negative value means argument number i was illegal β INFO = -i tells you exactly which one snitched π
π Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 157 of file dormr2.f. yes, line 157, iykyk β
πΈ Author (again, but the auto-generated one)
Generated automatically by Doxygen for LAPACK from the source code. no human hands touched this one, it's giving robot chic π€β¨
and that's the whole page bestie!! π this was LAPACK, Version 3.12.0, from SRC/dormr2.f(3) β go forth and multiply some general matrices by orthogonal ones, you absolute main character π¦ππ
π¦ 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