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) β€” CUNMQL
  • subroutine dormql (side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info) β€” DORMQL
  • subroutine sormql (side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info) β€” SORMQL
  • subroutine 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 β€” SIDE is CHARACTER*1
    • = 'L': apply Q or Q**H from the Left;
    • = 'R': apply Q or Q**H from the Right.
  • TRANS β€” TRANS is CHARACTER*1
    • = 'N': No transpose, apply Q;
    • = 'C': Conjugate transpose, apply Q**H.
  • 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. The number of elementary reflectors whose product defines the matrix Q. If SIDE = 'L', M >= K >= 0; if SIDE = 'R', N >= K >= 0.
  • A β€” A is COMPLEX array, dimension (LDA,K). The i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by CGEQLF in the last k columns of its array argument A. πŸ™ˆ
  • LDA β€” LDA is INTEGER. The leading dimension of the array A. If SIDE = 'L', LDA >= max(1,M); if SIDE = 'R', LDA >= max(1,N).
  • TAU β€” TAU is COMPLEX array, dimension (K). TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by CGEQLF.
  • C β€” C is COMPLEX 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. she gets rewritten, ok, that's her journey πŸ’€
  • 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, if INFO = 0, WORK(1) returns the optimal LWORK. πŸ‘‘
  • 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. (so like, -1 is not a crime here, it's a vibe check ✨)
  • INFO β€” INFO is INTEGER
    • = 0: successful exit
    • < 0: if INFO = -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 β€” SIDE is CHARACTER*1
    • = 'L': apply Q or Q**T from the Left;
    • = 'R': apply Q or Q**T from the Right.
  • TRANS β€” TRANS is CHARACTER*1
    • = 'N': No transpose, apply Q;
    • = 'T': Transpose, apply Q**T.
  • 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. The number of elementary reflectors whose product defines the matrix Q. If SIDE = 'L', M >= K >= 0; if SIDE = 'R', N >= K >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA,K). The i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGEQLF in the last k columns of its array argument A.
  • LDA β€” LDA is INTEGER. The leading dimension of the array A. If SIDE = 'L', LDA >= max(1,M); if SIDE = 'R', LDA >= max(1,N).
  • TAU β€” TAU is DOUBLE PRECISION array, dimension (K). TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGEQLF.
  • 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 or Q**T*C or C*Q**T or C*Q.
  • 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, if INFO = 0, WORK(1) returns the optimal LWORK.
  • 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.
  • INFO β€” INFO is INTEGER
    • = 0: successful exit
    • < 0: if INFO = -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 β€” SIDE is CHARACTER*1
    • = 'L': apply Q or Q**T from the Left;
    • = 'R': apply Q or Q**T from the Right.
  • TRANS β€” TRANS is CHARACTER*1
    • = 'N': No transpose, apply Q;
    • = 'T': Transpose, apply Q**T.
  • 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. The number of elementary reflectors whose product defines the matrix Q. If SIDE = 'L', M >= K >= 0; if SIDE = 'R', N >= K >= 0.
  • A β€” A is REAL array, dimension (LDA,K). The i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by SGEQLF in the last k columns of its array argument A.
  • LDA β€” LDA is INTEGER. The leading dimension of the array A. If SIDE = 'L', LDA >= max(1,M); if SIDE = 'R', LDA >= max(1,N).
  • TAU β€” TAU is REAL array, dimension (K). TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by SGEQLF.
  • 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 β€” a REAL array, dimension (LDC,N). On entry it's your M-by-N matrix C, and on exit C gets overwritten by Q*C or Q**T*C or C*Q**T or C*Q πŸ’– (which one depends on SIDE and TRANS, and yes bestie those four are a whole mood)
  • LDC β€” INTEGER, the leading dimension of the array C. Rule to live by: LDC >= max(1,M). No exceptions, no vibes-based math, periodt πŸŽ€
  • WORK β€” a REAL array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, then WORK(1) returns the optimal LWORK. She's giving helpful bestie energy ✨
  • LWORK β€” 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. (Bigger workspace = happier routine, fr fr 🫢)

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: if INFO = -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': apply Q or Q**H from the Left;
    • = 'R': apply Q or Q**H from the Right. 🫢
  • TRANS β€” CHARACTER*1.
    • = 'N': No transpose, apply Q;
    • = 'C': Conjugate transpose, apply Q**H. πŸ’…
  • M β€” INTEGER, the number of rows of the matrix C. Requirement: M >= 0. (Zero is allowed, we don't judge 🌈)
  • N β€” INTEGER, the number of columns of the matrix C. Requirement: N >= 0.
  • K β€” 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 β€” COMPLEX*16 array, dimension (LDA,K). The i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by ZGEQLF in the last k columns of its array argument A. Literally the exact same object, no cap ⭐
  • LDA β€” INTEGER, the leading dimension of the array A.
    • If SIDE = 'L', LDA >= max(1,M);
    • if SIDE = 'R', LDA >= max(1,N). Respect the leading dimension, she's not optional 😀
  • TAU β€” COMPLEX*16 array, dimension (K). TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by ZGEQLF. That's her iconic little scalar ✨
  • C β€” 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. Choose your fighter based on SIDE and TRANS πŸ’–
  • LDC β€” INTEGER, the leading dimension of the array C. Requirement: LDC >= max(1,M). Say it with me: max(1,M). 🎯
  • WORK β€” COMPLEX*16 array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, then WORK(1) returns the optimal LWORK. Very demure, very mindful 🧚
  • LWORK β€” 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. Give her room to breathe, bestie 🌸

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: if INFO = -i, the i-th argument had an illegal value. So like… which one? -i tells 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