/home/abui.../dgemqrt.f(3)

πŸ“¦ version 3.12.0, in opensuse-leap 16.0

πŸ’… NAME πŸ’…

okay so this whole page is literally about /home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/dgemqrt.f β€” like, that's the file, that's the main character, that's the whole vibe. It's from the Library Functions Manual, and bestie, we are about to get so into it. ✨


✨ SYNOPSIS ✨

πŸŽ€ Functions/Subroutines πŸŽ€

  • subroutine DGEMQRT (side, trans, m, n, k, nb, v, ldv, t, ldt, c, ldc, work, info) β€” DGEMQRT. yes that's it, that's the function, she's iconic, she's booked and busy πŸ’…

πŸ¦‹ Function/Subroutine Documentation πŸ¦‹

subroutine DGEMQRT (character side, character trans, integer m, integer n,
    integer k, integer nb, double precision, dimension( ldv, * ) v, integer
    ldv, double precision, dimension( ldt, * ) t, integer ldt, double
    precision, dimension( ldc, * ) c, integer ldc, double precision,
    dimension( * ) work, integer info)

DGEMQRT. that's her name, don't wear it out. 🫢

🌸 Purpose 🌸

okay so here's the tea, and it's good tea β˜•:

!>
!> DGEMQRT 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(1) H(2) . . . H(K) = I - V T V**T
!>
!> generated using the compact WY representation as returned by DGEQRT.
!>
!> Q is of order M if SIDE = 'L' and of order N  if SIDE = 'R'.
!>

translation for my besties who don't dream in Fortran 😭: she takes your matrix C and replaces it with Q C, Q**T C, C Q**T or C Q depending on which side you're coming from. and Q? Q is this real orthogonal glow-up built from K elementary reflectors β€” Q = H(1) H(2) . . . H(K) = I - V T V**T β€” using the compact WY representation that DGEQRT handed back. Q is order M when SIDE = 'L' and order N when SIDE = 'R'. periodt. πŸ”₯

πŸ’œ Parameters πŸ’œ

okay bestie, here's the full roster, no skips, no crumbs. every single one. πŸ‘‘

SIDE

!>          SIDE is CHARACTER*1
!>          = 'L': apply Q or Q**T from the Left;
!>          = 'R': apply Q or Q**T from the Right.
!>

lowkey the most important one. 'L' = apply Q or Q**T from the Left, 'R' = apply Q or Q**T from the Right. choose wisely, she's watching πŸ‘€

TRANS

!>          TRANS is CHARACTER*1
!>          = 'N':  No transpose, apply Q;
!>          = 'C':  Transpose, apply Q**T.
!>

'N' = no transpose, apply Q. 'C' = transpose, apply Q**T. yup, it's 'C', that's not a typo, that's literally what it says 🫢

M

!>          M is INTEGER
!>          The number of rows of the matrix C. M >= 0.
!>

the number of rows of C. M >= 0. that's the whole thing, no drama 🌸

N

!>          N is INTEGER
!>          The number of columns of the matrix C. N >= 0.
!>

the number of columns of C. N >= 0. slay ✨

K

!>          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.
!>

how many elementary reflectors are multiplying together to define Q. and check the ranges: if SIDE = 'L', then M >= K >= 0; if SIDE = 'R', then N >= K >= 0. no cap πŸ’…

NB

!>          NB is INTEGER
!>          The block size used for the storage of T.  K >= NB >= 1.
!>          This must be the same value of NB used to generate T
!>          in DGEQRT.
!>

the block size used for storing T. K >= NB >= 1. and listen β€” this must be the same value of NB used to generate T in DGEQRT. not "close to", not "vibes-adjacent", the same. don't come in here with a mismatched NB, it will not go well 😭

V

!>          V is DOUBLE PRECISION array, dimension (LDV,K)
!>          The i-th column must contain the vector which defines the
!>          elementary reflector H(i), for i = 1,2,...,k, as returned by
!>          DGEQRT in the first K columns of its array argument A.
!>

DOUBLE PRECISION array, dimension (LDV,K). the i-th column has to contain the vector defining the elementary reflector H(i), for i = 1,2,...,k, exactly as DGEQRT returned it in the first K columns of its array argument A. like-for-like, no edits πŸ¦‹

LDV

!>          LDV is INTEGER
!>          The leading dimension of the array V.
!>          If SIDE = 'L', LDA >= max(1,M);
!>          if SIDE = 'R', LDA >= max(1,N).
!>

the leading dimension of the array V. and before you @ me β€” yes, it literally says LDA in the LDV entry. we're just quoting the manpage verbatim, bestie, we don't make the rules πŸ’€ so: if SIDE = 'L', LDA >= max(1,M); if SIDE = 'R', LDA >= max(1,N).

T

!>          T is DOUBLE PRECISION array, dimension (LDT,K)
!>          The upper triangular factors of the block reflectors
!>          as returned by DGEQRT, stored as a NB-by-N matrix.
!>

DOUBLE PRECISION array, dimension (LDT,K). the upper triangular factors of the block reflectors, as returned by DGEQRT, stored as a NB-by-N matrix. queen of structure πŸŽ€

LDT

!>          LDT is INTEGER
!>          The leading dimension of the array T.  LDT >= NB.
!>

leading dimension of the array T. LDT >= NB. short and iconic, we stan ⭐

C

!>          C is DOUBLE PRECISION array, dimension (LDC,N)
!>          On entry, the M-by-N matrix C.
!>          On exit, C is overwritten by Q C, Q**T C, C Q**T or C Q.
!>

DOUBLE PRECISION array, dimension (LDC,N). on entry: the M-by-N matrix C, innocent, minding her business. on exit: C is overwritten by Q C, Q**T C, C Q**T or C Q. so yeah, she does NOT survive the function call intact, back up your data if you needed the original πŸ™ˆ

LDC

!>          LDC is INTEGER
!>          The leading dimension of the array C. LDC >= max(1,M).
!>

leading dimension of the array C. LDC >= max(1,M). respect the constraint πŸ’œ

WORK

!>          WORK is DOUBLE PRECISION array. The dimension of
!>          WORK is N*NB if SIDE = 'L', or  M*NB if SIDE = 'R'.
!>

DOUBLE PRECISION array. dimension of WORK is N*NB if SIDE = 'L', or M*NB if SIDE = 'R'. size it right or perish πŸ’€

INFO

!>          INFO is INTEGER
!>          = 0:  successful exit
!>          < 0:  if INFO = -i, the i-th argument had an illegal value
!>

INTEGER. = 0 means successful exit, we love to see it πŸŽ‰ and < 0 means if INFO = -i, the i-th argument had an illegal value. read your INFO, bestie, she's literally telling you which argument you fumbled πŸ“’

πŸ‘‘ Author πŸ‘‘

full credit to the legends, no gatekeeping:

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

and this whole thing lives at Definition at line 166 of file dgemqrt.f. 🫢


🌈 Author 🌈

generated automatically by Doxygen for LAPACK from the source code. the robots did this one, we just added the glitter ✨


okay that's the page!! πŸ’– this absolute icon is from LAPACK, Version 3.12.0, and she's filed under /home/abui.../dgemqrt.f(3) in the Library Functions Manual. go forth and apply your Q in the correct direction, bestie β€” mwah πŸŽ€πŸ¦‹πŸ’…

πŸ“¦ where this page comes from