| """ | |
| We have a few different kind of Matrices | |
| Matrix, ImmutableMatrix, MatrixExpr | |
| Here we test the extent to which they cooperate | |
| """ | |
| from sympy.core.symbol import symbols | |
| from sympy.matrices import (Matrix, MatrixSymbol, eye, Identity, | |
| ImmutableMatrix) | |
| from sympy.matrices.expressions import MatrixExpr, MatAdd | |
| from sympy.matrices.matrixbase import classof | |
| from sympy.testing.pytest import raises | |
| SM = MatrixSymbol('X', 3, 3) | |
| SV = MatrixSymbol('v', 3, 1) | |
| MM = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) | |
| IM = ImmutableMatrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) | |
| meye = eye(3) | |
| imeye = ImmutableMatrix(eye(3)) | |
| ideye = Identity(3) | |
| a, b, c = symbols('a,b,c') | |
| def test_IM_MM(): | |
| assert isinstance(MM + IM, ImmutableMatrix) | |
| assert isinstance(IM + MM, ImmutableMatrix) | |
| assert isinstance(2*IM + MM, ImmutableMatrix) | |
| assert MM.equals(IM) | |
| def test_ME_MM(): | |
| assert isinstance(Identity(3) + MM, MatrixExpr) | |
| assert isinstance(SM + MM, MatAdd) | |
| assert isinstance(MM + SM, MatAdd) | |
| assert (Identity(3) + MM)[1, 1] == 6 | |
| def test_equality(): | |
| a, b, c = Identity(3), eye(3), ImmutableMatrix(eye(3)) | |
| for x in [a, b, c]: | |
| for y in [a, b, c]: | |
| assert x.equals(y) | |
| def test_matrix_symbol_MM(): | |
| X = MatrixSymbol('X', 3, 3) | |
| Y = eye(3) + X | |
| assert Y[1, 1] == 1 + X[1, 1] | |
| def test_matrix_symbol_vector_matrix_multiplication(): | |
| A = MM * SV | |
| B = IM * SV | |
| assert A == B | |
| C = (SV.T * MM.T).T | |
| assert B == C | |
| D = (SV.T * IM.T).T | |
| assert C == D | |
| def test_indexing_interactions(): | |
| assert (a * IM)[1, 1] == 5*a | |
| assert (SM + IM)[1, 1] == SM[1, 1] + IM[1, 1] | |
| assert (SM * IM)[1, 1] == SM[1, 0]*IM[0, 1] + SM[1, 1]*IM[1, 1] + \ | |
| SM[1, 2]*IM[2, 1] | |
| def test_classof(): | |
| A = Matrix(3, 3, range(9)) | |
| B = ImmutableMatrix(3, 3, range(9)) | |
| C = MatrixSymbol('C', 3, 3) | |
| assert classof(A, A) == Matrix | |
| assert classof(B, B) == ImmutableMatrix | |
| assert classof(A, B) == ImmutableMatrix | |
| assert classof(B, A) == ImmutableMatrix | |
| raises(TypeError, lambda: classof(A, C)) | |