Matrix Expressions
The Matrix expression module allows users to write down statements like
>>> X = MatrixSymbol('X', 3, 3)
>>> Y = MatrixSymbol('Y', 3, 3)
>>> (X.T*X).inverse()*Y
X^-1*X.T^-1*Y
>>> Matrix(X)
Matrix([
[X[0, 0], X[0, 1], X[0, 2]],
[X[1, 0], X[1, 1], X[1, 2]],
[X[2, 0], X[2, 1], X[2, 2]]])
>>> (X*Y)[1, 2]
X[1, 0]*Y[0, 2] + X[1, 1]*Y[1, 2] + X[1, 2]*Y[2, 2]
where X
and Y
are MatrixSymbol
’s rather than scalar symbols.
Matrix Expressions Core Reference
- class diofant.matrices.expressions.MatrixExpr(*args, **kwargs)[source]
Superclass for Matrix Expressions
MatrixExprs represent abstract matrices, linear transformations represented within a particular basis.
Examples
>>> A = MatrixSymbol('A', 3, 3) >>> y = MatrixSymbol('y', 3, 1) >>> x = (A.T*A).inverse() * A * y
See also
- property T
Matrix transposition.
- as_explicit()[source]
Returns a dense Matrix with elements represented explicitly
Returns an object of type ImmutableMatrix.
Examples
>>> I = Identity(3) >>> I I >>> I.as_explicit() Matrix([ [1, 0, 0], [0, 1, 0], [0, 0, 1]])
See also
as_mutable
returns mutable Matrix type
- as_mutable()[source]
Returns a dense, mutable matrix with elements represented explicitly
Examples
>>> I = Identity(3) >>> I I >>> I.shape (3, 3) >>> I.as_mutable() Matrix([ [1, 0, 0], [0, 1, 0], [0, 0, 1]])
See also
as_explicit
returns ImmutableMatrix
- class diofant.matrices.expressions.MatrixSymbol(name, n, m, **assumptions)[source]
Symbolic representation of a Matrix object
Creates a Diofant Symbol to represent a Matrix. This matrix has a shape and can be included in Matrix Expressions
>>> 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
- class diofant.matrices.expressions.MatAdd(*args, **kwargs)[source]
A Sum of Matrix Expressions
MatAdd inherits from and operates like Diofant Add
>>> A = MatrixSymbol('A', 5, 5) >>> B = MatrixSymbol('B', 5, 5) >>> C = MatrixSymbol('C', 5, 5) >>> MatAdd(A, B, C) A + B + C
- class diofant.matrices.expressions.MatMul(*args, **kwargs)[source]
A product of matrix expressions
Examples
>>> A = MatrixSymbol('A', 5, 4) >>> B = MatrixSymbol('B', 4, 3) >>> C = MatrixSymbol('C', 3, 6) >>> MatMul(A, B, C) A*B*C
- class diofant.matrices.expressions.Inverse(mat)[source]
The multiplicative inverse of a matrix expression
This is a symbolic object that simply stores its argument without evaluating it. To actually compute the inverse, use the
.inverse()
method of matrices.Examples
>>> A = MatrixSymbol('A', 3, 3) >>> B = MatrixSymbol('B', 3, 3) >>> Inverse(A) A^-1 >>> A.inverse() == Inverse(A) True >>> (A*B).inverse() B^-1*A^-1 >>> Inverse(A*B) (A*B)^-1
- class diofant.matrices.expressions.Transpose(*args, **kwargs)[source]
The transpose of a matrix expression.
This is a symbolic object that simply stores its argument without evaluating it. To actually compute the transpose, use the
transpose()
function, or the.T
attribute of matrices.Examples
>>> A = MatrixSymbol('A', 3, 5) >>> B = MatrixSymbol('B', 5, 3) >>> Transpose(A) A.T >>> A.T == transpose(A) == Transpose(A) True >>> Transpose(A*B) (A*B).T >>> transpose(A*B) B.T*A.T
- class diofant.matrices.expressions.Trace(mat)[source]
Matrix Trace
Represents the trace of a matrix expression.
>>> A = MatrixSymbol('A', 3, 3) >>> Trace(A) Trace(A)
- class diofant.matrices.expressions.FunctionMatrix(rows, cols, lamda)[source]
Represents a Matrix using a function (Lambda)
This class is an alternative to SparseMatrix
>>> i, j = symbols('i j') >>> X = FunctionMatrix(3, 3, Lambda((i, j), i + j)) >>> Matrix(X) Matrix([ [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
Block Matrices
Block matrices allow you to construct larger matrices out of smaller
sub-blocks. They can work with MatrixExpr
or
ImmutableMatrix
objects.
- class diofant.matrices.expressions.blockmatrix.BlockMatrix(*args)[source]
A BlockMatrix is a Matrix composed of other smaller, submatrices
The submatrices are stored in a Diofant Matrix object but accessed as part of a Matrix Expression
>>> X = MatrixSymbol('X', n, n) >>> Y = MatrixSymbol('Y', m, m) >>> Z = MatrixSymbol('Z', n, m) >>> B = BlockMatrix([[X, Z], [ZeroMatrix(m, n), Y]]) >>> B Matrix([ [X, Z], [0, Y]])
>>> C = BlockMatrix([[Identity(n), Z]]) >>> C Matrix([[I, Z]])
>>> block_collapse(C*B) Matrix([[X, Z + Z*Y]])
- transpose()[source]
Return transpose of matrix.
Examples
>>> X = MatrixSymbol('X', n, n) >>> Y = MatrixSymbol('Y', m, m) >>> Z = MatrixSymbol('Z', n, m) >>> B = BlockMatrix([[X, Z], [ZeroMatrix(m, n), Y]]) >>> B.transpose() Matrix([ [X.T, 0], [Z.T, Y.T]]) >>> _.transpose() Matrix([ [X, Z], [0, Y]])
- class diofant.matrices.expressions.blockmatrix.BlockDiagMatrix(*mats)[source]
A BlockDiagMatrix is a BlockMatrix with matrices only along the diagonal
>>> X = MatrixSymbol('X', n, n) >>> Y = MatrixSymbol('Y', m, m) >>> BlockDiagMatrix(X, Y) Matrix([ [X, 0], [0, Y]])
- diofant.matrices.expressions.blockmatrix.block_collapse(expr)[source]
Evaluates a block matrix expression
>>> X = MatrixSymbol('X', n, n) >>> Y = MatrixSymbol('Y', m, m) >>> Z = MatrixSymbol('Z', n, m) >>> B = BlockMatrix([[X, Z], [ZeroMatrix(m, n), Y]]) >>> B Matrix([ [X, Z], [0, Y]])
>>> C = BlockMatrix([[Identity(n), Z]]) >>> C Matrix([[I, Z]])
>>> block_collapse(C*B) Matrix([[X, Z + Z*Y]])