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.