I would probably just monkey patch the .multiply_elementwise into a shorter
method name within your code

from sympy import *
Matrix.me = Matrix.multiply_elementwise

# your code here

or if you wanted the % syntax

Matrix.__mod__ = Matrix.multiply_elementwise

There are lots of reasons why you shouldn't do this.  I suspect that none
of them will matter much when writing your thesis.

Good luck!

-Matt


On Sun, Feb 2, 2014 at 9:52 AM, Jason Moore <[email protected]> wrote:

> Here is a better definition as Aaron points out:
>
> In [25]: class MyMatrix(Matrix):
>     def __mul__(self, other):
>         return self.multiply_elementwise(other)
>    ....:
>
> In [26]: K = MyMatrix(k)
>
> In [27]: M = MyMatrix(m)
>
> In [28]: K * M
> Out[28]:
> Matrix([
> [k[0, 0]*m[0, 0], k[0, 1]*m[0, 1]],
> [k[1, 0]*m[1, 0], k[1, 1]*m[1, 1]]])
>
>
>
> Jason
> moorepants.info
> +01 530-601-9791
>
>
> On Sun, Feb 2, 2014 at 12:30 PM, Aaron Meurer <[email protected]> wrote:
>
>> It's much better to define the methods when you define the class. When
>> I do it your way, MyMatrix([1, 2, 3])*Matrix([1, 2, 3]) gives
>> ShapeError, but when I do it my way, it works just fine.
>>
>> In fact, I don't understand why your example works at all. You are
>> taking a method on an instance (K), which already has the implicit
>> argument of self, and putting it on the class, MyMatrix, which
>> doesn't.
>>
>> Aaron Meurer
>>
>> On Sun, Feb 2, 2014 at 11:18 AM, Jason Moore <[email protected]>
>> wrote:
>> > Here is one example of class overload that works:
>> >
>> > In [1]: from sympy import Matrix, MatrixSymbol
>> >
>> > In [2]: k = MatrixSymbol('k', 2, 2)
>> >
>> > In [3]: m = MatrixSymbol('m', 2, 2)
>> >
>> > In [4]: K = Matrix(k)
>> >
>> > In [5]: M = Matrix(m)
>> >
>> > In [6]: K * M
>> > Out[6]:
>> > Matrix([
>> > [k[0, 0]*m[0, 0] + k[0, 1]*m[1, 0], k[0, 0]*m[0, 1] + k[0, 1]*m[1, 1]],
>> > [k[1, 0]*m[0, 0] + k[1, 1]*m[1, 0], k[1, 0]*m[0, 1] + k[1, 1]*m[1, 1]]])
>> >
>> > In [7]: class MyMatrix(Matrix):
>> >     pass
>> >    ...:
>> >
>> > In [8]: MyMatrix.__mul__ = K.multiply_elementwise
>> >
>> > In [9]: K = MyMatrix(k)
>> >
>> > In [10]: M = MyMatrix(m)
>> >
>> > In [11]: K * M
>> > Out[11]:
>> > Matrix([
>> > [k[0, 0]*m[0, 0], k[0, 1]*m[0, 1]],
>> > [k[1, 0]*m[1, 0], k[1, 1]*m[1, 1]]])
>> >
>> >
>> >
>> > Jason
>> > moorepants.info
>> > +01 530-601-9791
>> >
>> >
>> > On Sun, Feb 2, 2014 at 12:16 PM, Aaron Meurer <[email protected]>
>> wrote:
>> >>
>> >> Or, if you don't use matrix multiplication at all, then you could
>> >> overload __mul__.
>> >>
>> >> And I forgot to mention that you'll want to overload both __op__ and
>> >> __rop__ for whatever operator you choose.
>> >>
>> >> Aaron Meurer
>> >>
>> >> On Sun, Feb 2, 2014 at 11:15 AM, Aaron Meurer <[email protected]>
>> wrote:
>> >> > To elaborate on what Sergey is saying, you need to understand that
>> >> > SymPy is just Python, so it is limited by what is available in
>> Python.
>> >> > .* is not a valid operator in Python, so there is no way to make it
>> >> > work.
>> >> >
>> >> > In addition to this, SymPy philosophy is to make the Python operators
>> >> > mean what they mean in normal Python. % is the modulo operator, so it
>> >> > may not make sense to use it for something completely different. On
>> >> > the other hand, I'm not sure if % can ever make sense for matrices,
>> so
>> >> > maybe it would be possible.
>> >> >
>> >> > I would recommend just creating a light subclass of Matrix for your
>> >> > work, and overload an operator to do elementwise multiplication.
>> There
>> >> > is a list of all Python operators here
>> >> >
>> >> >
>> http://docs.python.org/3.3/reference/expressions.html#operator-precedence
>> .
>> >> > You should be aware of the precedence of the operator you choose. %
>> >> > actually probably is a good choice, because it has the same
>> precedence
>> >> > as *.
>> >> >
>> >> > Something like
>> >> >
>> >> > class MyMatrix(Matrix):
>> >> >     def __mod__(self, other):
>> >> >         return self.multiply_elementwise(other)
>> >> >
>> >> > You'll want to be sure to document this nicely in your thesis, so
>> that
>> >> > people don't think that % is SymPy behavior.
>> >> >
>> >> > If you come across an instance where something returns a normal
>> Matrix
>> >> > instead of a MyMatrix, that's most likely a bug that you should
>> >> > report.
>> >> >
>> >> > Aaron Meurer
>> >> >
>> >> > On Sun, Feb 2, 2014 at 11:04 AM, Sergey Kirpichev <
>> [email protected]>
>> >> > wrote:
>> >> >> On Sunday, February 2, 2014 8:30:45 PM UTC+4, David Kremer wrote:
>> >> >>>
>> >> >>> What I would simply ask, is if it wouldn't be possible to overload
>> an
>> >> >>> operator such as "%" or ".*" to
>> >> >>> implement matrix elementwise multiplication in sympy. It would
>> greatly
>> >> >>> improve the readability of my
>> >> >>> code.
>> >> >>
>> >> >>
>> >> >> First, there is no ".*" operator at all:
>> >> >>
>> http://docs.python.org/dev/reference/lexical_analysis.html#operators
>> >> >>
>> >> >> % - stands for integer division (yields the remainder).  While it's
>> >> >> possible
>> >> >> to overload
>> >> >> it, I doubt if that's natural and pythonic (to include in sympy).
>>  In
>> >> >> your
>> >> >> words, it's too hackish.
>> >> >>
>> >> >>>
>> >> >>> About the second question, it is about the point if defining a
>> single
>> >> >>> operator such as ".*" in matlab
>> >> >>> could be done in sympy
>> >> >>
>> >> >>
>> >> >> Probably, this can be done only with some syntax extension.
>> >> >>
>> >> >> BTW, see also PEP 225.
>> >> >>
>> >> >> --
>> >> >> 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.
>> >> >> For more options, visit https://groups.google.com/groups/opt_out.
>> >>
>> >> --
>> >> 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.
>> >> For more options, visit https://groups.google.com/groups/opt_out.
>> >
>> >
>> > --
>> > 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.
>> > For more options, visit https://groups.google.com/groups/opt_out.
>>
>> --
>> 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.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>  --
> 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.
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
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.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to