Source code for sympy.matrices.expressions.matpow

from __future__ import print_function, division

from .matexpr import MatrixExpr, ShapeError, Identity
from sympy import Pow, S, Basic
from sympy.core.sympify import _sympify
from sympy.matrices import MatrixBase
from sympy.core import S


[docs]class MatPow(MatrixExpr):
def __new__(cls, base, exp): base = _sympify(base) if not base.is_Matrix: raise TypeError("Function parameter should be a matrix") exp = _sympify(exp) return super(MatPow, cls).__new__(cls, base, exp) @property def base(self): return self.args[0] @property def exp(self): return self.args[1] @property def shape(self): return self.base.shape def _entry(self, i, j): if self.exp.is_zero: if not self.base.is_square: raise ShapeError("Power of non-square matrix %s" % self.base) T = Identity(self.base.shape[0]) elif self.exp is S.One: T = self.base elif isinstance(self.base, MatrixBase): # e.g., ImmutableMatrix**S.Half not covered by MatMul cases below T = self.base**self.exp elif self.exp.is_Integer and self.exp.is_positive: # Make an explicit MatMul out of the MatPow T = MatMul(*[self.base for k in range(self.exp)]) #elif self.exp.is_Integer and self.exp.is_negative: # # Note: possible future improvement: in principle we can take # # positive powers of the inverse, but carefully avoid recursion, # # perhaps by adding `_entry` to Inverse (as it is our subclass). # T = self.base.inverse() # T = MatMul(*[T for k in range(-self.exp)]) else: raise NotImplementedError(("(%d, %d) entry" % (int(i), int(j))) + "of matrix power either not defined or not implemented") return T._entry(i, j) from .matmul import MatMul