ZUNMLQ(3)

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

πŸ’… ZUNMLQ(3) β€” like, the LAPACK manual but make it make sense

okay so bestie, before we even start: this page lives in the LAPACK manual (LAPACK), and the file it documents is zunmlq.f. slay. let's get into it πŸ’–


✨ NAME ✨

/home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/zunmlq.f

like... yes, that's genuinely the whole name entry. it's giving "the path IS the personality". iconic of it tbh πŸŽ€


🌸 SYNOPSIS 🌸

Functions/Subroutines

subroutine ZUNMLQ (side, trans, m, n, k, a, lda, tau, c, ldc, work,
    lwork, info)

ZUNMLQ β€” that's her. that's the girl.


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

subroutine ZUNMLQ (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)

ZUNMLQ β€” the full cast list, no cap ✨


πŸ’œ Purpose:

!> !> ZUNMLQ 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 . . . H(2)**H H(1)**H !> !> as returned by ZGELQF. Q is of order M if SIDE = 'L' and of order N !> if SIDE = 'R'. !>

so basically the vibe is: ZUNMLQ takes your general complex M-by-N matrix C and overwrites it β€” yes, overwrites, she does not ask permission β€” with one of four flavours depending on SIDE and TRANS, and the sweet little table above is the whole menu. πŸ’…

and Q itself? Q is a complex unitary matrix, defined as the product of k elementary reflectors:

Q = H(k)**H . . . H(2)**H H(1)**H

β€” exactly as handed back to you by ZGELQF. Q is of order M if SIDE = 'L', and of order N if SIDE = 'R'. periodt 🫢


🌈 Parameters

⭐ SIDE

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

SIDE is CHARACTER*1 β€” one whole character, she's low-maintenance:

  • 'L' β€” apply Q or Q**H from the Left
  • 'R' β€” apply Q or Q**H from the Right

choose your fighter πŸ‘‘

πŸ“ TRANS

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

TRANS is CHARACTER*1 too:

  • 'N' β€” no transpose, apply Q (the chill option)
  • 'C' β€” conjugate transpose, apply Q**H (the spicy option) πŸ”₯

🧚 M

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

M is INTEGER β€” the number of rows of the matrix C. and M >= 0, bestie, we don't do negative rows here πŸ™ˆ

πŸŽ€ N

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

N is INTEGER β€” the number of columns of the matrix C. N >= 0, same energy πŸ’–

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

K is INTEGER β€” the number of elementary reflectors whose product defines the matrix Q. the constraints, fr fr:

  • if SIDE = 'L', then M >= K >= 0
  • if SIDE = 'R', then N >= K >= 0

πŸ’€ 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 !> elementary reflector H(i), for i = 1,2,...,k, as returned by !> ZGELQF in the first k rows of its array argument A. !>

A is a COMPLEX*16 array, and its dimension depends on SIDE:

  • (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 ZGELQF in the first k rows of its array argument A. yes, i-th row, not column β€” don't get it twisted 😭

πŸ‘‘ LDA

!> LDA is INTEGER !> The leading dimension of the array A. LDA >= max(1,K). !>

LDA is INTEGER β€” the leading dimension of the array A. and it must be LDA >= max(1,K). that max(1,...) is doing a lot of heavy lifting, respect her 🫢

πŸ¦‹ TAU

!> TAU is COMPLEX*16 array, dimension (K) !> TAU(i) must contain the scalar factor of the elementary !> reflector H(i), as returned by ZGELQF. !>

TAU is a COMPLEX*16 array, dimension (K). TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by ZGELQF. she's tiny but she MATTERS ⭐

πŸ’… 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. !>

C is a 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

(see what I meant about her not asking permission? main character energy, honestly 🌈)

🌟 LDC

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

LDC is INTEGER β€” the leading dimension of the array C, and LDC >= max(1,M). keep it legal bestie πŸ’œ

✨ WORK

!> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) !> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. !>

WORK is a COMPLEX*16 array, dimension (MAX(1,LWORK)). on exit, if INFO = 0, then WORK(1) returns the optimal LWORK. cute little two-for-one πŸ”₯

🧚 LWORK

!> LWORK is INTEGER !> The dimension of the array WORK. !> If SIDE = 'L', LWORK >= max(1,N); !> if SIDE = 'R', LWORK >= max(1,M). !> For good performance, LWORK should generally be larger. !> !> 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. !>

LWORK is INTEGER β€” the dimension of the array WORK.

  • if SIDE = 'L', then LWORK >= max(1,N)
  • if SIDE = 'R', then LWORK >= max(1,M)
for good performance, LWORK should generally be larger. like, treat her. she deserves it πŸ’–

and the special case, iykyk:

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. so like, don't panic, that's just the vibe check mode πŸ’€

πŸŽ€ INFO

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

INFO is INTEGER:

  • = 0 β€” successful exit, we ate, no notes πŸ‘‘
  • < 0 β€” if INFO = -i, the i-th argument had an illegal value. and she WILL tell you which one 😭

🌸 Author

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

the whole squad, credited, as they should be 🫢


πŸ’œ Definition at line 165 of file zunmlq.f.

like, line 165. precise. documented. iconic.


⭐ Author

Generated automatically by Doxygen for LAPACK from the source code.

(so if the vibes are slightly robotic, blame Doxygen, not me πŸŽ€)


πŸ’– that's the whole page bestie πŸ’– every flag, every bound, every max(1,...) β€” all present and accounted for. go forth and multiply your unitary matrices responsibly. and remember: this was LAPACK, Version 3.12.0 🌈, from /home/abui...RC/zunmlq.f(3) β€” mwah πŸ’…βœ¨

πŸ“¦ where this page comes from