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.
