class_docstr: A product of matrix expressions
  
  Examples
  ========
  
  >>> 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
class_docstr_tok: ["A","product","of","matrix","expressions","Examples","========",">",">",">","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"]
code: def _eval_derivative_matrix_lines(self, x):
      from .transpose import Transpose
  
      with_x_ind = [i for i, arg in enumerate(self.args) if arg.has(x)]
      lines = []
      for ind in with_x_ind:
          left_args = self.args[:ind]
          right_args = self.args[ind + 1 :]
  
          if right_args:
              right_mat = MatMul.fromiter(right_args)
          else:
              right_mat = Identity(self.shape[1])
          if left_args:
              left_rev = MatMul.fromiter(
                  [
                      Transpose(i).doit() if i.is_Matrix else i
                      for i in reversed(left_args)
                  ]
              )
          else:
              left_rev = Identity(self.shape[0])
  
          d = self.args[ind]._eval_derivative_matrix_lines(x)
          for i in d:
              i.append_first(left_rev)
              i.append_second(right_mat)
              lines.append(i)
  
      return lines
  
imports: from sympy.assumptions.ask import ask, Q
  from sympy.assumptions.refine import handlers_dict
  from sympy.core import Basic, sympify, S
  from sympy.core.mul import mul, Mul
  from sympy.core.numbers import Number, Integer
  from sympy.core.symbol import Dummy
  from sympy.functions import adjoint
  from sympy.strategies import rm_id, unpack, typed, flatten, exhaust, do_one, new
  from sympy.matrices.exceptions import NonInvertibleMatrixError
  from sympy.matrices.matrixbase import MatrixBase
  from sympy.utilities.exceptions import sympy_deprecation_warning
  from sympy.matrices.expressions._shape import validate_matmul_integer
  from .inverse import Inverse
  from .matexpr import MatrixExpr
  from .matpow import MatPow
  from .transpose import transpose
  from .permutation import PermutationMatrix
  from .special import ZeroMatrix, Identity, GenericIdentity, OneMatrix
label_desc: Use image node_id 15 for calling the MatMul obj's underlying member method code with example usage: obj._eval_derivative_matrix_lines(x) and returns: lines