| name | matrix-operations |
| description | Use specialized matrix types with symbolic tags for efficient linear algebra. Use when working with diagonal, block, or tagged matrices to avoid unnecessary dense computations. |
Matrix Operations
linsdex provides specialized matrix types that track structural properties for automatic optimization. Instead of always using dense matrices, the library uses diagonal, block, and tagged matrices to avoid unnecessary computation.
When to Use
- Working with diagonal covariance matrices
- Building block-structured systems (e.g., position + velocity states)
- Optimizing linear algebra with zero or identity matrices
- Understanding the matrix type system in linsdex
Matrix Types
DiagonalMatrix
Stores only diagonal elements for O(n) operations instead of O(n²) or O(n³).
import jax.numpy as jnp
from linsdex import DiagonalMatrix
diag_elements = jnp.array([1.0, 2.0, 3.0])
D = DiagonalMatrix(diag_elements)
I = DiagonalMatrix.eye(3)
D_inv = D.get_inverse()
log_det = D.get_log_det()
elements = D.get_elements()
DenseMatrix
General dense matrices when structure cannot be exploited.
from linsdex import DenseMatrix, TAGS
elements = jnp.array([[1.0, 0.5], [0.5, 2.0]])
M = DenseMatrix(elements, tags=TAGS.no_tags)
M_inv = M.get_inverse()
chol = M.get_cholesky()
log_det = M.get_log_det()
Block Matrices
For higher-order systems with natural block structure (e.g., position + velocity in tracking).
from linsdex.matrix.block import Block2x2Matrix
from linsdex import DiagonalMatrix, DenseMatrix, TAGS
A = DiagonalMatrix.eye(2)
B = DenseMatrix(jnp.zeros((2, 2)), tags=TAGS.zero_tags)
C = DenseMatrix(jnp.zeros((2, 2)), tags=TAGS.zero_tags)
D = DiagonalMatrix.eye(2)
block_matrix = Block2x2Matrix(A, B, C, D)
inv = block_matrix.get_inverse()
Matrix Tags
Tags track properties like zero and infinite values, enabling symbolic simplification before numerical computation.
from linsdex import TAGS
TAGS.no_tags
TAGS.zero_tags
TAGS.inf_tags
How Tags Work
Tags propagate through operations automatically:
from linsdex import DenseMatrix, TAGS
zero = DenseMatrix(jnp.zeros((3, 3)), tags=TAGS.zero_tags)
nonzero = DenseMatrix(jnp.eye(3), tags=TAGS.no_tags)
result = zero @ nonzero
result = nonzero + zero
Infinite Tags for Uncertainty
Infinite matrices represent total uncertainty (precision = 0):
inf_precision = DenseMatrix(jnp.zeros((3, 3)), tags=TAGS.inf_tags)
Code Examples
Efficient Diagonal Operations
from linsdex import DiagonalMatrix, StandardGaussian
dim = 100
variances = jnp.ones(dim)
Sigma = DiagonalMatrix(variances)
precision = Sigma.get_inverse()
log_det = Sigma.get_log_det()
chol = Sigma.get_cholesky()
mu = jnp.zeros(dim)
dist = StandardGaussian(mu, Sigma)
Block Matrix for State Space Models
from linsdex.matrix.block import Block2x2Matrix
from linsdex import DiagonalMatrix, DenseMatrix, TAGS
dt = 0.1
dim = 1
A11 = DiagonalMatrix.eye(dim)
A12 = DiagonalMatrix(jnp.ones(dim) * dt)
A21 = DenseMatrix(jnp.zeros((dim, dim)), tags=TAGS.zero_tags)
A22 = DiagonalMatrix.eye(dim)
transition_matrix = Block2x2Matrix(A11, A12, A21, A22)
Creating Matrices with Correct Tags
from linsdex import DenseMatrix, DiagonalMatrix, TAGS
M = DenseMatrix(jnp.eye(3), tags=TAGS.no_tags)
Z = DenseMatrix(jnp.zeros((3, 3)), tags=TAGS.zero_tags)
D = DiagonalMatrix(jnp.array([1.0, 2.0, 3.0]))
Matrix Operations
from linsdex import DiagonalMatrix, DenseMatrix, TAGS
D = DiagonalMatrix(jnp.array([2.0, 3.0]))
M = DenseMatrix(jnp.array([[1.0, 0.5], [0.5, 1.0]]), tags=TAGS.no_tags)
v = jnp.array([1.0, 2.0])
result = D @ v
result = D @ M
D_inv = D.get_inverse()
chol = M.get_cholesky()
log_det = D.get_log_det()
Using with Gaussian Distributions
from linsdex import StandardGaussian, NaturalGaussian, DiagonalMatrix
dim = 5
mu = jnp.zeros(dim)
Sigma = DiagonalMatrix.eye(dim) * 0.5
std_dist = StandardGaussian(mu, Sigma)
nat_dist = std_dist.to_nat()
Key Classes
DiagonalMatrix(elements) - Diagonal matrix from 1D array
DenseMatrix(elements, tags) - Dense matrix with symbolic tags
Block2x2Matrix(A, B, C, D) - 2x2 block matrix
Block3x3Matrix(...) - 3x3 block matrix
TAGS - Symbolic tags for optimization
Common Methods
All matrix types support:
get_inverse() - Matrix inverse
get_cholesky() - Cholesky decomposition
get_log_det() - Log determinant
get_elements() - Raw array elements
@ operator - Matrix multiplication (matmul)
- Scalar multiplication and addition
Tips
- Use
DiagonalMatrix whenever dimensions are independent to save computation
- Set correct tags when creating
DenseMatrix to enable symbolic optimization
- Block matrices are useful for higher-order state space models
- Tags propagate automatically through operations
- The library chooses the most efficient representation for operation results
- Use
DiagonalMatrix.eye(n) for identity matrices