A packed storage matrix, also known as packed matrix, is a term used in programming for representing an m × n {\displaystyle m\times n} matrix. It is a more compact way than an m-by-n rectangular array by exploiting a special structure of the matrix.
Typical examples of matrices that can take advantage of packed storage include:
Triangular packed matrices
The packed storage matrix allows a matrix to be converted to an array, shrinking the matrix significantly. In doing so, a square n × n {\displaystyle n\times n} matrix is converted to an array of length n(n+1)/2.1
Consider the following upper matrix:
U = ( a 11 a 12 a 13 a 14 a 22 a 23 a 24 a 33 a 34 a 44 ) {\displaystyle \mathbf {U} ={\begin{pmatrix}a_{11}&a_{12}&a_{13}&a_{14}\\&a_{22}&a_{23}&a_{24}\\&&a_{33}&a_{34}\\&&&a_{44}\\\end{pmatrix}}}which can be packed into the one array:
U P = ( a 11 ⏟ a 12 a 22 ⏟ a 13 a 23 a 33 ⏟ a 14 , a 24 a 34 a 44 ⏟ ) {\displaystyle \mathbf {UP} =(\underbrace {a_{11}} \ \underbrace {a_{12}\ a_{22}} \ \underbrace {a_{13}\ a_{23}\ a_{33}} \ \underbrace {a_{14},\ a_{24}\ a_{34}\ a_{44}} )} 2Similarly the lower matrix:
L = ( a 11 a 21 a 22 a 31 a 32 a 33 a 41 a 42 a 43 a 44 ) . {\displaystyle \mathbf {L} ={\begin{pmatrix}a_{11}&&&\\a_{21}&a_{22}&&\\a_{31}&a_{32}&a_{33}&\\a_{41}&a_{42}&a_{43}&a_{44}\\\end{pmatrix}}.}can be packed into the following one dimensional array:
L P = ( a 11 a 21 a 31 a 41 ⏟ a 22 a 32 a 42 ⏟ a 33 a 43 ⏟ a 44 ⏟ ) {\displaystyle LP=(\underbrace {a_{11}\ a_{21}\ a_{31}\ a_{41}} \ \underbrace {a_{22}\ a_{32}\ a_{42}} \ \underbrace {a_{33}\ a_{43}} \ \underbrace {a_{44}} )} 3Code examples (Fortran)
Both of the following storage schemes are used extensively in BLAS and LAPACK.
An example of packed storage for Hermitian matrix:
complex :: A(n,n) ! a hermitian matrix complex :: AP(n*(n+1)/2) ! packed storage for A ! the lower triangle of A is stored column-by-column in AP. ! unpacking the matrix AP to A do j=1,n k = j*(j-1)/2 A(1:j,j) = AP(1+k:j+k) A(j,1:j-1) = conjg(AP(1+k:j-1+k)) end doAn example of packed storage for banded matrix:
real :: A(m,n) ! a banded matrix with kl subdiagonals and ku superdiagonals real :: AP(-kl:ku,n) ! packed storage for A ! the band of A is stored column-by-column in AP. Some elements of AP are unused. ! unpacking the matrix AP to A do j = 1, n forall(i=max(1,j-kl):min(m,j+ku)) A(i,j) = AP(i-j,j) end do print *,AP(0,:) ! the diagonalSee also
Further reading
- https://www.netlib.org/lapack/lug/
- https://www.netlib.org/blas/
- https://github.com/numericalalgorithmsgroup/LAPACK_Examples
References
Golub, Gene H.; Van Loan, Charles F. (2013). Matrix Computations (4th ed.). Baltimore, MD: Johns Hopkins University Press. p. 170. ISBN 9781421407944. 9781421407944 ↩
Blackford, Susan (1999-10-01). "Packed Storage". Netlib. LAPACK Users' Guide. Archived from the original on 2024-04-01. Retrieved 2024-10-01. https://web.archive.org/web/20240401131450/https://www.netlib.org/lapack/lug/node123.html ↩
Blackford, Susan (1999-10-01). "Packed Storage". Netlib. LAPACK Users' Guide. Archived from the original on 2024-04-01. Retrieved 2024-10-01. https://web.archive.org/web/20240401131450/https://www.netlib.org/lapack/lug/node123.html ↩