|
|
|
|
|
from sympy.core.kind import Kind, _NumberKind, NumberKind |
|
from sympy.core.mul import Mul |
|
|
|
|
|
class MatrixKind(Kind): |
|
""" |
|
Kind for all matrices in SymPy. |
|
|
|
Basic class for this kind is ``MatrixBase`` and ``MatrixExpr``, |
|
but any expression representing the matrix can have this. |
|
|
|
Parameters |
|
========== |
|
|
|
element_kind : Kind |
|
Kind of the element. Default is |
|
:class:`sympy.core.kind.NumberKind`, |
|
which means that the matrix contains only numbers. |
|
|
|
Examples |
|
======== |
|
|
|
Any instance of matrix class has kind ``MatrixKind``: |
|
|
|
>>> from sympy import MatrixSymbol |
|
>>> A = MatrixSymbol('A', 2, 2) |
|
>>> A.kind |
|
MatrixKind(NumberKind) |
|
|
|
An expression representing a matrix may not be an instance of |
|
the Matrix class, but it will have kind ``MatrixKind``: |
|
|
|
>>> from sympy import MatrixExpr, Integral |
|
>>> from sympy.abc import x |
|
>>> intM = Integral(A, x) |
|
>>> isinstance(intM, MatrixExpr) |
|
False |
|
>>> intM.kind |
|
MatrixKind(NumberKind) |
|
|
|
Use ``isinstance()`` to check for ``MatrixKind`` without specifying the |
|
element kind. Use ``is`` to check the kind including the element kind: |
|
|
|
>>> from sympy import Matrix |
|
>>> from sympy.core import NumberKind |
|
>>> from sympy.matrices import MatrixKind |
|
>>> M = Matrix([1, 2]) |
|
>>> isinstance(M.kind, MatrixKind) |
|
True |
|
>>> M.kind is MatrixKind(NumberKind) |
|
True |
|
|
|
See Also |
|
======== |
|
|
|
sympy.core.kind.NumberKind |
|
sympy.core.kind.UndefinedKind |
|
sympy.core.containers.TupleKind |
|
sympy.sets.sets.SetKind |
|
|
|
""" |
|
def __new__(cls, element_kind=NumberKind): |
|
obj = super().__new__(cls, element_kind) |
|
obj.element_kind = element_kind |
|
return obj |
|
|
|
def __repr__(self): |
|
return "MatrixKind(%s)" % self.element_kind |
|
|
|
|
|
@Mul._kind_dispatcher.register(_NumberKind, MatrixKind) |
|
def num_mat_mul(k1, k2): |
|
""" |
|
Return MatrixKind. The element kind is selected by recursive dispatching. |
|
Do not need to dispatch in reversed order because KindDispatcher |
|
searches for this automatically. |
|
""" |
|
|
|
|
|
|
|
|
|
|
|
if not isinstance(k2, MatrixKind): |
|
k1, k2 = k2, k1 |
|
elemk = Mul._kind_dispatcher(k1, k2.element_kind) |
|
return MatrixKind(elemk) |
|
|
|
|
|
@Mul._kind_dispatcher.register(MatrixKind, MatrixKind) |
|
def mat_mat_mul(k1, k2): |
|
""" |
|
Return MatrixKind. The element kind is selected by recursive dispatching. |
|
""" |
|
elemk = Mul._kind_dispatcher(k1.element_kind, k2.element_kind) |
|
return MatrixKind(elemk) |
|
|