SSPTRD(3)
π SSPTRD(3) β like, the whole glow-up where a symmetric matrix becomes tridiagonal
okay so first things first, bestie: this page lives in the Library Functions Manual under the name ssptrd.f(3) (the full path situation is /home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/ssptrd.f, and yes, they truncated it in the header to /home/abui...RC/ssptrd.f(3) β it's giving "we ran out of room at the function name, periodt"). Anyway. Let's get into it π
β¨ NAME β¨
SSPTRD β the routine that reduces a real symmetric matrix A stored in packed form to symmetric tridiagonal form T by an orthogonal similarity transformation: Q*T * A * Q = T.* no cap, that's literally the whole serve π₯
π¦ SYNOPSIS π¦
Functions/Subroutines
subroutine SSPTRD (uplo, n, ap, d, e, tau, info)β the one and only, the main character herself π
π Function/Subroutine Documentation π
subroutine SSPTRD (character uplo, integer n, real, dimension( * ) ap, real,
dimension( * ) d, real, dimension( * ) e, real, dimension( * ) tau,
integer info)
Just SSPTRD. That's it. That's the name. Iconic behaviour, honestly β¨
πΈ Purpose πΈ
!>SSPTRDreduces a real symmetric matrix A stored in packed form to symmetric tridiagonal form T by an orthogonal similarity transformation:Q**T * A * Q = T.
Yeah so she takes your packed-away symmetric matrix A, does a whole orthogonal similarity transformation moment, and hands you back a tridiagonal T. It's giving makeover montage π§
β Parameters β
π UPLO
!> UPLO is CHARACTER*1
!>='U': Upper triangle of A is stored;!>='L': Lower triangle of A is stored.
Translation: which half of the matrix are you handing her? Upper or lower. Pick one, she'll slay either way π«Ά
π N
!> N is INTEGER
!> The order of the matrix A. N >= 0.
Zero is allowed, bestie, don't stress. Negative is not the vibe.
π AP
!> AP is REAL array, dimension (N*(N+1)/2)
!> On entry, the upper or lower triangle of the symmetric matrix A, packed columnwise in a linear array. The j-th column of A is stored in the array AP as follows:
!>if UPLO ='U',AP(i + (j-1)*j/2) = A(i,j)for1<=i<=j;!>if UPLO ='L',AP(i + (j-1)*(2*n-j)/2) = A(i,j)forj<=i<=n.
!> On exit, if UPLO = 'U', the diagonal and first superdiagonal of A are overwritten by the corresponding elements of the tridiagonal matrix T, and the elements above the first superdiagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors; if UPLO = 'L', the diagonal and first subdiagonal of A are over-written by the corresponding elements of the tridiagonal matrix T, and the elements below the first subdiagonal, with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.
Lowkey the most important thing here: AP gets overwritten. Like, she moves in and redecorates. You don't get your original A back. You get T's diagonal + first off-diagonal, plus the reflector data (with TAU) that encodes Q. The exact index maths is above β copy it, don't vibe-guess it π
π¦ D
!> D is REAL array, dimension (N)
!> The diagonal elements of the tridiagonal matrix T: D(i) = A(i,i).
The main-character diagonal. Fresh out of the transformation π
π E
!> E is REAL array, dimension (N-1)
!> The off-diagonal elements of the tridiagonal matrix T: E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'.
The little side pieces of the tridiagonal. Note the dimension is (N-1), because obviously a tridiagonal has one fewer off-diagonal than diagonal. Math said so π
π§ TAU
!> TAU is REAL array, dimension (N-1)
!> The scalar factors of the elementary reflectors (see Further Details).
These are the tau scalars, and they're how Q gets reconstructed later. Keep them safe, they're the receipts π§Ύ
π₯ INFO
!> INFO is INTEGER
!>=0: successful exit!><0: ifINFO = -i, the i-th argument had an illegal value
So 0 = we ate and left no crumbs. Negative = somebody passed something cursed, and she's telling you which argument by index. Very considerate of her, honestly π«Ά
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Four whole institutions. Group project but make it actually work β¨
πΈ Further Details: πΈ
okay this is the part where she explains exactly how Q is built, and you're gonna want to actually read it because it's the whole recipe:
!> If UPLO = 'U', the matrix Q is represented as a product of elementary reflectors
!> Q = H(n-1) . . . H(2) H(1).
!> Each H(i) has the form
!> H(i) = I - tau * v * v**T
!> where tau is a real scalar, and v is a real vector with v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in AP, overwriting A(1:i-1,i+1), and tau is stored in TAU(i).
!> If UPLO = 'L', the matrix Q is represented as a product of elementary reflectors
!> Q = H(1) H(2) . . . H(n-1).
!> Each H(i) has the form
!> H(i) = I - tau * v * v**T
!> where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in AP, overwriting A(i+2:n,i), and tau is stored in TAU(i).
Notice the order is reversed between the two cases β H(n-1) . . . H(2) H(1) for 'U' vs H(1) H(2) . . . H(n-1) for 'L'. Not me almost missing that. Don't be me. Read it twice π
β Definition at line 149 of file ssptrd.f. β
That's literally where she lives. Line one-four-nine. π
π Author π
Generated automatically by Doxygen for LAPACK from the source code.
Not a human. A robot did this. And honestly? She ate π€β¨
ok bestie that's the whole page, every flag, every index formula, every tau, preserved with love π go forth and reduce your symmetric packed matrices
LAPACK Β· Version 3.12.0 Β· signed off with a kiss from /home/abui...RC/ssptrd.f(3) π«Άπ
π¦ 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