BLAS/SRC/sgemmtr.f(3)
๐ฆ BLAS/SRC/sgemmtr.f โ a page from the Library Functions Manual ๐
okay so bestie, gather round, because today we're talking about sgemmtr and honestly? she's iconic โจ
๐ธ SYNOPSIS
Functions/Subroutines
subroutine sgemmtr (uplo, transa, transb, n, k, alpha, a, lda, b, ldb, beta, c, ldc)โ SGEMMTR ๐
๐ Function/Subroutine Documentation
subroutine sgemmtr (character uplo, character transa, character transb, integer n, integer k, real alpha, real, dimension(lda,*) a, integer lda, real, dimension(ldb,*) b, integer ldb, real beta, real, dimension(ldc,*) c, integer ldc)
SGEMMTR ๐ซถ
๐ Purpose:
!>
!> SGEMMTR performs one of the matrix-matrix operations
!>
!> C := alpha*op( A )*op( B ) + beta*C,
!>
!> where op( X ) is one of
!>
!> op( X ) = X or op( X ) = X**T,
!>
!> alpha and beta are scalars, and A, B and C are matrices, with op( A )
!> an n by k matrix, op( B ) a k by n matrix and C an n by n matrix.
!> Thereby, the routine only accesses and updates the upper or lower
!> triangular part of the result matrix C. This behaviour can be used if
!> the resulting matrix C is known to be symmetric.
!>
so basically it's the classic C := alpha*op( A )*op( B ) + beta*C moment, except she's not doing the whole matrix โ only the upper or lower triangle of C gets touched. that's the whole lewk, and it means you can use this when you already know C is symmetric ๐โจ
๐ Parameters
UPLO
!> UPLO is CHARACTER*1
!> On entry, UPLO specifies whether the lower or the upper
!> triangular part of C is access and updated.
!>
!> UPLO = 'L' or 'l', the lower triangular part of C is used.
!>
!> UPLO = 'U' or 'u', the upper triangular part of C is used.
!>
CHARACTER*1 โ tells her which triangle of C she's allowed to touch and update. 'L' or 'l'? lower triangle, periodt. 'U' or 'u'? upper triangle, no cap ๐
TRANSA
!> TRANSA is CHARACTER*1
!> On entry, TRANSA specifies the form of op( A ) to be used in
!> the matrix multiplication as follows:
!>
!> TRANSA = 'N' or 'n', op( A ) = A.
!>
!> TRANSA = 'T' or 't', op( A ) = A**T.
!>
!> TRANSA = 'C' or 'c', op( A ) = A**T.
!>
CHARACTER*1 โ how op( A ) shows up to the party. 'N'/'n' โ op( A ) = A. 'T'/'t' โ op( A ) = A**T. 'C'/'c' โ op( A ) = A**T (yes, same as 'T', she said what she said) ๐ฆ
TRANSB
!> TRANSB is CHARACTER*1
!> On entry, TRANSB specifies the form of op( B ) to be used in
!> the matrix multiplication as follows:
!>
!> TRANSB = 'N' or 'n', op( B ) = B.
!>
!> TRANSB = 'T' or 't', op( B ) = B**T.
!>
!> TRANSB = 'C' or 'c', op( B ) = B**T.
!>
CHARACTER*1 โ same energy but for B. 'N'/'n' โ op( B ) = B. 'T'/'t' โ op( B ) = B**T. 'C'/'c' โ op( B ) = B**T. twins fr fr ๐ฏ
N
!> N is INTEGER
!> On entry, N specifies the number of rows and columns of
!> the matrix C, the number of columns of op(B) and the number
!> of rows of op(A). N must be at least zero.
!>
INTEGER โ she's doing a lot of heavy lifting: rows and columns of C, columns of op(B), rows of op(A). main character energy ๐ and N must be at least zero โ negative? not today ๐
K
!> K is INTEGER
!> On entry, K specifies the number of columns of the matrix
!> op( A ) and the number of rows of the matrix op( B ). K must
!> be at least zero.
!>
INTEGER โ columns of op( A ), rows of op( B ). and again, K must be at least zero ๐ซถ
ALPHA
!> ALPHA is REAL.
!> On entry, ALPHA specifies the scalar alpha.
!>
REAL โ she's the scalar alpha, that's the whole job, and she's serving โญ
A
!> A is REAL array, dimension ( LDA, ka ), where ka is
!> k when TRANSA = 'N' or 'n', and is n otherwise.
!> Before entry with TRANSA = 'N' or 'n', the leading n by k
!> part of the array A must contain the matrix A, otherwise
!> the leading k by m part of the array A must contain the
!> matrix A.
!>
REAL array, dimension ( LDA, ka ) where ka is k when TRANSA = 'N' or 'n', and is n otherwise. so: with TRANSA = 'N' or 'n', the leading n by k part of the array A must contain the matrix A; otherwise the leading k by m part of the array A must contain the matrix A ๐ (yes, that's m โ we're quoting her exactly, don't come for me)
LDA
!> LDA is INTEGER
!> On entry, LDA specifies the first dimension of A as declared
!> in the calling (sub) program. When TRANSA = 'N' or 'n' then
!> LDA must be at least max( 1, n ), otherwise LDA must be at
!> least max( 1, k ).
!>
INTEGER โ first dimension of A as declared in the calling (sub) program. TRANSA = 'N' or 'n' โ LDA must be at least max( 1, n ); otherwise โ LDA must be at least max( 1, k ). respect the boundary bestie ๐ง
B
!> B is REAL array, dimension ( LDB, kb ), where kb is
!> n when TRANSB = 'N' or 'n', and is k otherwise.
!> Before entry with TRANSB = 'N' or 'n', the leading k by n
!> part of the array B must contain the matrix B, otherwise
!> the leading n by k part of the array B must contain the
!> matrix B.
!>
REAL array, dimension ( LDB, kb ) where kb is n when TRANSB = 'N' or 'n', and is k otherwise. TRANSB = 'N' or 'n' โ the leading k by n part of B holds the matrix B; otherwise the leading n by k part holds it ๐ง
LDB
!> LDB is INTEGER
!> On entry, LDB specifies the first dimension of B as declared
!> in the calling (sub) program. When TRANSB = 'N' or 'n' then
!> LDB must be at least max( 1, k ), otherwise LDB must be at
!> least max( 1, n ).
!>
INTEGER โ first dimension of B as declared in the calling (sub) program. TRANSB = 'N' or 'n' โ LDB must be at least max( 1, k ); otherwise โ LDB must be at least max( 1, n ) ๐
BETA
!> BETA is REAL.
!> On entry, BETA specifies the scalar beta. When BETA is
!> supplied as zero then C need not be set on input.
!>
REAL โ the scalar beta. and here's the lil hack: when BETA is supplied as zero then C need not be set on input ๐ฎโ๐จ love a shortcut
C
!> C is REAL array, dimension ( LDC, N )
!> Before entry, the leading n by n part of the array C must
!> contain the matrix C, except when beta is zero, in which
!> case C need not be set on entry.
!> On exit, the upper or lower triangular part of the matrix
!> C is overwritten by the n by n matrix
!> ( alpha*op( A )*op( B ) + beta*C ).
!>
REAL array, dimension ( LDC, N ). on entry the leading n by n part must contain the matrix C โ except when beta is zero, in which case C need not be set on entry. on exit, the upper or lower triangular part of C gets overwritten by the n by n matrix ( alpha*op( A )*op( B ) + beta*C ) ๐ฅ only the triangle, remember, she's selective like that ๐
LDC
!> LDC is INTEGER
!> On entry, LDC specifies the first dimension of C as declared
!> in the calling (sub) program. LDC must be at least
!> max( 1, n ).
!>
INTEGER โ first dimension of C as declared in the calling (sub) program, and LDC must be at least max( 1, n ) ๐
๐ Author
Martin Koehler โจ
๐ Further Details:
!>
!> Level 3 Blas routine.
!>
!> -- Written on 19-July-2023.
!> Martin Koehler, MPI Magdeburg
!>
yup, Level 3 Blas routine. โ written on 19-July-2023 by Martin Koehler, MPI Magdeburg ๐
๐ Definition at line 189 of file sgemmtr.f.
๐ Author
Generated automatically by Doxygen for LAPACK from the source code. (not me, a robot did it, and honestly? she ate ๐ค๐ )
ok that's the whole page bestie, every flag and every caveat is right there โ now go forth and only touch the triangle you were assigned ๐ฆโจ
LAPACK โ Version 3.12.0 โ BLAS/SRC/sgemmtr.f(3) ๐ mwah, see u in the source code ๐ซถ
๐ฆ 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