A matrix A and a MatrixSymbol B are defined as follows:

>>> from sympy import *
>>> q = MatrixSymbol('q', 4, 1)
>>> A = Matrix([[q[0,0], 1, 2], [q[1,0], 2, 3], [q[2,0], 3, 4]])
>>> B = MatrixSymbol('B', 3, 3)

The behavior is different for A * B and B * A. The operation A * B succeeds:

>>> A * B
Matrix([
[q[0, 0], 1, 2],
[q[1, 0], 2, 3],
[q[2, 0], 3, 4]])*B

However, B * A crashes:

>>> B * A
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/matrices/expressions/matexpr.py",
 line 21, in __sympifyit_wrapper
    return func(a, b)
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/core/decorators.py",
 line 118, in binary_op_wrapper
    return func(self, other)
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/matrices/expressions/matexpr.py",
 line 101, in __mul__
    return MatMul(self, other).doit()
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/matrices/expressions/matmul.py",
 line 112, in doit
    return canonicalize(MatMul(*args))
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/strategies/core.py",
 line 11, in exhaustive_rl
    new, old = rule(expr), expr
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/strategies/core.py",
 line 95, in switch_rl
    return rl(expr)
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/strategies/core.py",
 line 85, in do_one_rl
    result = rl(expr)
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/matrices/expressions/matmul.py",
 line 183, in xxinv
    if X.is_square and Y.is_square and X == Y.inverse():
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/matrices/expressions/matexpr.py",
 line 194, in inverse
    return self._eval_inverse()
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/matrices/dense.py",
 line 307, in _eval_inverse
    rv = M.inverse_GE(iszerofunc=iszerofunc)
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/matrices/matrices.py",
 line 2621, in inverse_GE
    red = big.rref(iszerofunc=iszerofunc, simplify=True)[0]
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/matrices/matrices.py",
 line 2679, in rref
    r[pivot, i] = simpfunc(r[pivot, i])
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/simplify/simplify.py",
 line 3700, in simplify
    expr2 = shorter(together(expr, deep=True), together(expr1, deep=True))
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/simplify/simplify.py",
 line 3694, in shorter
    return min(choices, key=measure)
  File 
"/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy-0.7.6_git-py2.7.egg/sympy/core/function.py",
 line 2290, in count_ops
    if a.is_Rational:
AttributeError: 'str' object has no attribute 'is_Rational'

The cause of the crash is related to issue with count_ops ( 
https://groups.google.com/forum/#!topic/sympy/Edq9jnzwqhI )

Can we make the behavior of MatrixSymbol * Matrix same as Matrix * 
MatrixSymbol ? (Since multiplication is supposed to be commutative)

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/d9abd8f9-7173-4dcf-8408-c56729bd2753%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to