The Kronecker Product
A block-structured product of two matrices that builds large operators from smaller ones.
Definition
The Kronecker product of an m-by-n matrix A and a p-by-q matrix B, written A tensor B, is an (mp)-by-(nq) matrix formed by replacing each entry a_ij of A with the block a_ij times B. The result is a large matrix built from scaled copies of B arranged in the pattern of A. It captures the structure of operators acting on multidimensional grids.
Properties
- (A tensor B)(C tensor D) = (AC) tensor (BD), the mixed-product rule
- (A tensor B)^T = A^T tensor B^T
- (A tensor B)^{-1} = A^{-1} tensor B^{-1} when both are invertible
- eigenvalues of A tensor B are all products of an eigenvalue of A with one of B
The vec trick
Stacking the columns of a matrix X into a single vector, written vec(X), links the Kronecker product to matrix equations: vec(A X B) = (B^T tensor A) vec(X). This identity converts the matrix equation A X B = C into an ordinary linear system, and it is the key to solving Sylvester and Lyapunov equations that arise in control theory.
Separable operators
On a two-dimensional grid, a differential operator that acts independently along each axis is a sum of Kronecker products, such as (D tensor I) + (I tensor D). This structure lets fast solvers work on each dimension separately, avoiding the cost of treating the full grid at once, and it generalizes to any number of dimensions.
import numpy as np
A = np.array([[1, 0], [0, 2]])
B = np.array([[1, 1], [0, 1]])
print(np.kron(A, B).shape) # (4, 4)
Discretized operators for multidimensional plasma and field simulations are naturally expressed as sums of Kronecker products, exposing separable structure that dramatically reduces solve cost.