/home/abui.../zunbdb3.f(3)
π NAME
okay so bestie, this is the manual page for /home/abui.../zunbdb3.f(3) β it lives in the Library Functions Manual, and it's all about a Fortran subroutine called ZUNBDB3 from the LAPACK source at /home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/zunbdb3.f. Yes that path is a whole meal, we're moving on π«Ά
β¨ SYNOPSIS
So under Functions/Subroutines you've got this icon:
subroutine ZUNBDB3 (m, p, q, x11, ldx11, x21, ldx21, theta, phi, taup1,
taup2, tauq1, work, lwork, info)
ZUNBDB3
π Function/Subroutine Documentation
the actual signature (full version, no cuts) πΈ
subroutine ZUNBDB3 (integer m, integer p, integer q, complex*16,
dimension(ldx11,*) x11, integer ldx11, complex*16, dimension(ldx21,*)
x21, integer ldx21, double precision, dimension(*) theta, double
precision, dimension(*) phi, complex*16, dimension(*) taup1, complex*16,
dimension(*) taup2, complex*16, dimension(*) tauq1, complex*16,
dimension(*) work, integer lwork, integer info)
ZUNBDB3
Purpose π
!> !> ZUNBDB3 simultaneously bidiagonalizes the blocks of a tall and skinny !> matrix X with orthonormal columns: !> !> [ B11 ] !> [ X11 ] [ P1 | ] [ 0 ] !> [-----] = [---------] [-----] Q1**T . !> [ X21 ] [ | P2 ] [ B21 ] !> [ 0 ] !> !> X11 is P-by-Q, and X21 is (M-P)-by-Q. M-P must be no larger than P, !> Q, or M-Q. Routines ZUNBDB1, ZUNBDB2, and ZUNBDB4 handle cases in !> which M-P is not the minimum dimension. !> !> The unitary matrices P1, P2, and Q1 are P-by-P, (M-P)-by-(M-P), !> and (M-Q)-by-(M-Q), respectively. They are represented implicitly by !> Householder vectors. !> !> B11 and B12 are (M-P)-by-(M-P) bidiagonal matrices represented !> implicitly by angles THETA, PHI. !> !>
(and yes, it literally says B12 up there β that's what the source says, not me, don't come for me π)
Like, the whole vibe is: you hand it a tall skinny matrix X with orthonormal columns, and it goes bidiagonalizes the blocks β that's the main character move π The M-P situation has to be the minimum dimension. If it's not? Then this routine is not the one, and you go hang out with ZUNBDB1, ZUNBDB2, or ZUNBDB4 instead. iykyk β¨
Parameters π¦
MβINTEGER. It's literally the number of rows ofX11plus the number of rows inX21. Math? Served. πPβINTEGER. The number of rows inX11. Constraint, no cap:0 <= P <= MandM-P <= min(P,Q,M-Q).QβINTEGER. The number of columns inX11andX21. Constraint:0 <= Q <= M. πX11βCOMPLEX*16 array, dimension (LDX11,Q). On entry it's the top block of the matrixXyou're reducing. On exit, the columns oftril(X11)specify reflectors forP1, and the rows oftriu(X11,1)specify reflectors forQ1. It goes in one thing and comes out a whole different thing, glow-up fr fr β¨LDX11βINTEGER. The leading dimension ofX11. Rule:LDX11 >= P. Respect the dimension bestie π«ΆX21βCOMPLEX*16 array, dimension (LDX21,Q). On entry, the bottom block of the matrixXto be reduced. On exit, the columns oftril(X21)specify reflectors forP2. Same deal, different block πΈLDX21βINTEGER. The leading dimension ofX21. Rule:LDX21 >= M-P. πTHETAβDOUBLE PRECISION array, dimension (Q). The entries of the bidiagonal blocksB11,B21are defined byTHETAandPHI. See Further Details below, it's giving lore π₯PHIβDOUBLE PRECISION array, dimension (Q-1). Again: the entries of the bidiagonal blocksB11,B21are defined byTHETAandPHI. Further Details, bestie, go look πTAUP1βCOMPLEX*16 array, dimension (P). The scalar factors of the elementary reflectors that defineP1. Iconic little scalars πTAUP2βCOMPLEX*16 array, dimension (M-P). The scalar factors of the elementary reflectors that defineP2. Matching set πTAUQ1βCOMPLEX*16 array, dimension (Q). The scalar factors of the elementary reflectors that defineQ1. Completing the trio πWORKβCOMPLEX*16 array, dimension (LWORK). It works soWORKcan work πLWORKβINTEGER. The dimension of the arrayWORK. Rule:LWORK >= M-Q.
okay important caveat π¨ 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. So-1is the "just tell me how much room I need" era, and nobody yells at you. π
INFOβINTEGER. The receipts:= 0: successful exit. slay π< 0: ifINFO = -i, the i-th argument had an illegal value. somebody passed something cursed π
Author πΏ
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
(the whole squad, credited, periodt π«Ά)
Further Details π
!> !> The upper-bidiagonal blocks B11, B21 are represented implicitly by !> angles THETA(1), ..., THETA(Q) and PHI(1), ..., PHI(Q-1). Every entry !> in each bidiagonal band is a product of a sine or cosine of a THETA !> with a sine or cosine of a PHI. See [1] or ZUNCSD for details. !> !> P1, P2, and Q1 are represented as products of elementary reflectors. !> See ZUNCSD2BY1 for details on generating P1, P2, and Q1 using ZUNGQR !> and ZUNGLQ. !>
so basically every entry in each bidiagonal band is a sine-or-cosine of a THETA times a sine-or-cosine of a PHI β trig girlies stay winning π§ And if you wanna actually generate P1, P2, Q1, you're hitting up ZUNCSD2BY1 for the instructions on ZUNGQR and ZUNGLQ. iykyk β
References π
[1] Brian D. Sutton. Computing the complete CS decomposition. Numer. Algorithms, 50(1):33-65, 2009.
(cite your sources, it's the bare minimum π )
Definition at line 199 of file zunbdb3.f. β that's where the real code lives, go look if you're nosy π
author note: generated automatically by Doxygen for LAPACK from the source code π
β¨ and that's the whole page bestie β LAPACK Version 3.12.0, /home/abui.../zunbdb3.f(3), no notes, ate and left no crumbs ππ
π¦ where this page comes from
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms