# Matrix Expressions¶

The Matrix expression module allows users to write down statements like

>>> from sympy import MatrixSymbol, Matrix
>>> X = MatrixSymbol('X', 3, 3)
>>> Y = MatrixSymbol('Y', 3, 3)
>>> (X.T*X).I*Y
X^-1*X'^-1*Y

>>> Matrix(X)
[X_00, X_01, X_02]
[X_10, X_11, X_12]
[X_20, X_21, X_22]

>>> (X*Y)[1, 2]
X_10*Y_02 + X_11*Y_12 + X_12*Y_22


where X and Y are MatrixSymbol‘s rather than scalar symbols.

## Matrix Expressions Core Reference¶

class sympy.matrices.expressions.MatrixExpr

Matrix Expression Class Matrix Expressions subclass SymPy Expr’s so that MatAdd inherits from Add MatMul inherits from Mul MatPow inherits from Pow

They use _op_priority to gain control with binary operations (+, , -, *) are used

They implement operations specific to Matrix Algebra.

Attributes

 is_Identity
as_explicit()

Returns a dense Matrix with elements represented explicitly

Returns an object of type ImmutableMatrix.

>>> from sympy import Identity
>>> I = Identity(3)
>>> I
I
>>> I.as_explicit()
[1, 0, 0]
[0, 1, 0]
[0, 0, 1]


as_mutable
returns MutableMatrix type
as_mutable()

Returns a dense Matrix with elements represented explicitly

Returns an object of type MutableMatrix.

>>> from sympy import Identity
>>> I = Identity(3)
>>> I
I
>>> I.as_mutable()
[1, 0, 0]
[0, 1, 0]
[0, 0, 1]


as_explicit
returns ImmutableMatrix
equals(other)

Test elementwise equality between matrices, potentially of different types

>>> from sympy import Identity, eye
>>> Identity(3).equals(eye(3))
True

class sympy.matrices.expressions.MatrixSymbol

Symbolic representation of a Matrix object

Creates a SymPy Symbol to represent a Matrix. This matrix has a shape and can be included in Matrix Expressions

>>> from sympy import MatrixSymbol, Identity
>>> A = MatrixSymbol('A', 3, 4) # A 3 by 4 Matrix
>>> B = MatrixSymbol('B', 4, 3) # A 4 by 3 Matrix
>>> A.shape
(3, 4)
>>> 2*A*B + Identity(3)
I + 2*A*B


Attributes

 is_Identity

A Sum of Matrix Expressions

MatAdd inherits from and operates like SymPy Add

>>> from sympy import MatAdd, MatrixSymbol
>>> A = MatrixSymbol('A', 5, 5)
>>> B = MatrixSymbol('B', 5, 5)
>>> C = MatrixSymbol('C', 5, 5)
>>> MatAdd(A, B, C)
A + B + C


Attributes

 is_Identity
class sympy.matrices.expressions.MatMul

A Product of Matrix Expressions

MatMul inherits from and operates like SymPy Mul

>>> from sympy import MatMul, MatrixSymbol
>>> A = MatrixSymbol('A', 5, 4)
>>> B = MatrixSymbol('B', 4, 3)
>>> C = MatrixSymbol('C', 3, 6)
>>> MatMul(A, B, C)
A*B*C


Attributes

 is_Identity
class sympy.matrices.expressions.MatPow

Attributes

 is_Identity
class sympy.matrices.expressions.Inverse

Matrix Inverse

Represents the Inverse of a matrix expression

Use .I as shorthand

>>> from sympy import MatrixSymbol, Inverse
>>> A = MatrixSymbol('A', 3, 3)
>>> B = MatrixSymbol('B', 3, 3)
>>> Inverse(A)
A^-1
>>> A.I
A^-1
>>> Inverse(A*B)
B^-1*A^-1


Attributes

 is_Identity
class sympy.matrices.expressions.Transpose

Matrix Transpose

Represents the transpose of a matrix expression.

Use .T as shorthand

>>> from sympy import MatrixSymbol, Transpose
>>> A = MatrixSymbol('A', 3, 5)
>>> B = MatrixSymbol('B', 5, 3)
>>> Transpose(A)
A'
>>> A.T
A'
>>> Transpose(A*B)
B'*A'


Attributes

 is_Identity
class sympy.matrices.expressions.Trace

Matrix Trace

Represents the trace of a matrix expression.

>>> from sympy import MatrixSymbol, Trace, eye
>>> A = MatrixSymbol('A', 3, 3)
>>> Trace(A)
Trace(A)

>>> Trace(eye(3))
3

class sympy.matrices.expressions.FunctionMatrix

Represents a Matrix using a function (Lambda)

This class is an alternative to SparseMatrix

>>> from sympy import FunctionMatrix, symbols, Lambda, MatMul, Matrix
>>> i, j = symbols('i,j')
>>> X = FunctionMatrix(3, 3, Lambda((i, j), i + j))
>>> Matrix(X)
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]

>>> Y = FunctionMatrix(1000, 1000, Lambda((i, j), i + j))

>>> isinstance(Y*Y, MatMul) # this is an expression object
True

>>> (Y**2)[10,10] # So this is evaluated lazily
342923500


Attributes

 is_Identity
class sympy.matrices.expressions.Identity

The Matrix Identity I - multiplicative identity

>>> from sympy.matrices import Identity, MatrixSymbol
>>> A = MatrixSymbol('A', 3, 5)
>>> I = Identity(3)
>>> I*A
A

class sympy.matrices.expressions.ZeroMatrix

The Matrix Zero 0 - additive identity

>>> from sympy import MatrixSymbol, ZeroMatrix
>>> A = MatrixSymbol('A', 3, 5)
>>> Z = ZeroMatrix(3, 5)
>>> A+Z
A
>>> Z*A.T
0


Attributes

 is_Identity

## Block Matrices¶

Block matrices allow you to construct larger matrices out of smaller sub-blocks. They can work with MatrixExpr or ImmutableMatrix objects.

class sympy.matrices.expressions.blockmatrix.BlockMatrix[source]

A BlockMatrix is a Matrix composed of other smaller, submatrices

The submatrices are stored in a SymPy Matrix object but accessed as part of a Matrix Expression

>>> from sympy import MatrixSymbol, BlockMatrix, symbols, Identity, ZeroMatrix, block_collapse
>>> n,m,l = symbols('n m l')
>>> X = MatrixSymbol('X', n, n)
>>> Y = MatrixSymbol('Y', m ,m)
>>> Z = MatrixSymbol('Z', n, m)
>>> B = BlockMatrix([[X, Z], [ZeroMatrix(m,n), Y]])
>>> print B
[X, Z]
[0, Y]

>>> C = BlockMatrix([[Identity(n), Z]])
>>> print C
[I, Z]

>>> print block_collapse(C*B)
[X, Z + Z*Y]

class sympy.matrices.expressions.blockmatrix.BlockDiagMatrix[source]

A BlockDiagMatrix is a BlockMatrix with matrices only along the diagonal

>>> from sympy import MatrixSymbol, BlockDiagMatrix, symbols, Identity
>>> n,m,l = symbols('n m l')
>>> X = MatrixSymbol('X', n, n)
>>> Y = MatrixSymbol('Y', m ,m)
>>> BlockDiagMatrix(X, Y)
[X, 0]
[0, Y]

sympy.matrices.expressions.blockmatrix.block_collapse(expr)[source]

Evaluates a block matrix expression

>>> from sympy import MatrixSymbol, BlockMatrix, symbols, Identity, Matrix, ZeroMatrix, block_collapse
>>> n,m,l = symbols('n m l')
>>> X = MatrixSymbol('X', n, n)
>>> Y = MatrixSymbol('Y', m ,m)
>>> Z = MatrixSymbol('Z', n, m)
>>> B = BlockMatrix([[X, Z], [ZeroMatrix(m, n), Y]])
>>> print B
[X, Z]
[0, Y]

>>> C = BlockMatrix([[Identity(n), Z]])
>>> print C
[I, Z]

>>> print block_collapse(C*B)
[X, Z + Z*Y]