SSPTRD(3)

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

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

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

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) for 1<=i<=j;
  • !> if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=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: if INFO = -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