SRC/cgghd3.f(3)
π SRC/cgghd3.f β the group-chat guide
okay so bestie, buckle up: this is SRC/cgghd3.f, and it's literally the blocked-variant glow-up of CGGHRD. It's giving linear algebra main character energy and honestly? Iconic. π
β¨ SYNOPSIS β¨
Functions/Subroutines β the whole squad:
subroutine cgghd3 (compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z,
ldz, work, lwork, info)
CGGHD3 π₯
π¦ Function/Subroutine Documentation π¦
subroutine cgghd3 (character compq, character compz, integer n, integer ilo,
integer ihi, complex, dimension( lda, * ) a, integer lda, complex,
dimension( ldb, * ) b, integer ldb, complex, dimension( ldq, * ) q,
integer ldq, complex, dimension( ldz, * ) z, integer ldz, complex,
dimension( * ) work, integer lwork, integer info)
CGGHD3 π
π Purpose π
okay so here's the tea, straight from the source:
!> !> !> CGGHD3 reduces a pair of complex matrices (A,B) to generalized upper !> Hessenberg form using unitary transformations, where A is a !> general matrix and B is upper triangular. The form of the !> generalized eigenvalue problem is !> A*x = lambda*B*x, !> and B is typically made upper triangular by computing its QR !> factorization and moving the unitary matrix Q to the left side !> of the equation. !> !> This subroutine simultaneously reduces A to a Hessenberg matrix H: !> Q**H*A*Z = H !> and transforms B to another upper triangular matrix T: !> Q**H*B*Z = T !> in order to reduce the problem to its standard form !> H*y = lambda*T*y !> where y = Z**H*x. !> !> The unitary matrices Q and Z are determined as products of Givens !> rotations. They may either be formed explicitly, or they may be !> postmultiplied into input matrices Q1 and Z1, so that !> !> Q1 * A * Z1**H = (Q1*Q) * H * (Z1*Z)**H !> !> Q1 * B * Z1**H = (Q1*Q) * T * (Z1*Z)**H !> !> If Q1 is the unitary matrix from the QR factorization of B in the !> original equation A*x = lambda*B*x, then CGGHD3 reduces the original !> problem to generalized Hessenberg form. !> !> This is a blocked variant of CGGHRD, using matrix-matrix !> multiplications for parts of the computation to enhance performance. !>
so yeah β it's the same job as CGGHRD but it does parts of the work with matrix-matrix multiplications so it goes faster. ate and left no crumbs π
πΈ Parameters πΈ
COMPQβCOMPQ is CHARACTER*1= 'N': do not compute Q;= 'I': Q is initialized to the unit matrix, and the unitary matrix Q is returned;= 'V': Q must contain a unitary matrix Q1 on entry, and the product Q1*Q is returned.
COMPZβCOMPZ is CHARACTER*1= 'N': do not compute Z;= 'I': Z is initialized to the unit matrix, and the unitary matrix Z is returned;= 'V': Z must contain a unitary matrix Z1 on entry, and the product Z1*Z is returned.
NβN is INTEGERThe order of the matrices A and B.N >= 0.ILOβILO is INTEGERIHIβIHI is INTEGERILOandIHImark the rows and columns of A which are to be reduced. It is assumed that A is already upper triangular in rows and columns1:ILO-1andIHI+1:N.ILOandIHIare normally set by a previous call toCGGBAL; otherwise they should be set to1andNrespectively.1 <= ILO <= IHI <= N, ifN > 0;ILO=1andIHI=0, ifN=0.AβA is COMPLEX array, dimension (LDA, N)On entry, the N-by-N general matrix to be reduced. On exit, the upper triangle and the first subdiagonal of A are overwritten with the upper Hessenberg matrix H, and the rest is set to zero.LDAβLDA is INTEGERThe leading dimension of the array A.LDA >= max(1,N).BβB is COMPLEX array, dimension (LDB, N)On entry, the N-by-N upper triangular matrix B. On exit, the upper triangular matrixT = Q**H B Z. The elements below the diagonal are set to zero.LDBβLDB is INTEGERThe leading dimension of the array B.LDB >= max(1,N).QβQ is COMPLEX array, dimension (LDQ, N)On entry, ifCOMPQ = 'V', the unitary matrix Q1, typically from the QR factorization of B. On exit, ifCOMPQ='I', the unitary matrix Q, and ifCOMPQ = 'V', the product Q1*Q. Not referenced ifCOMPQ='N'.LDQβLDQ is INTEGERThe leading dimension of the array Q.LDQ >= NifCOMPQ='V'or'I';LDQ >= 1otherwise.ZβZ is COMPLEX array, dimension (LDZ, N)On entry, ifCOMPZ = 'V', the unitary matrix Z1. On exit, ifCOMPZ='I', the unitary matrix Z, and ifCOMPZ = 'V', the product Z1*Z. Not referenced ifCOMPZ='N'.LDZβLDZ is INTEGERThe leading dimension of the array Z.LDZ >= NifCOMPZ='V'or'I';LDZ >= 1otherwise.WORKβWORK is COMPLEX array, dimension (MAX(1,LWORK))On exit, ifINFO = 0,WORK(1)returns the optimalLWORK.LWORKβLWORK is INTEGERThe length of the array WORK.LWORK >= 1. For optimum performanceLWORK >= 6*N*NB, whereNBis the optimal blocksize.
IfLWORK = -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 toLWORKis issued byXERBLA. π«Ά (no cap, that's the actual behavior)
INFOβINFO is INTEGER= 0: successful exit.< 0: ifINFO = -i, the i-th argument had an illegal value.
π Author π
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
β Further Details β
!> !> This routine reduces A to Hessenberg form and maintains B in triangular form !> using a blocked variant of Moler and Stewart's original algorithm, !> as described by Kagstrom, Kressner, Quintana-Orti, and Quintana-Orti !> (BIT 2008). !>
Moler and Stewart walked so this blocked variant could run π§ periodt.
π Definition π
Definition at line 229 of file cgghd3.f.
π Sign-off π
Author section, final form: Generated automatically by Doxygen for LAPACK from the source code. π (yes, the robots wrote the docs, we just made them cute)
And that's the whole page, bestie β from the LAPACK squad, Version 3.12.0, on SRC/cgghd3.f(3). slay, go reduce something πβ¨
π¦ 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