[sage-support] Re: element-wise multiplication of matrices

2009-06-08 Thread paramaniac

Thank you for the fast response!

Regards,
Lukas
--~--~-~--~~~---~--~~
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: element-wise multiplication of matrices

2009-06-08 Thread paramaniac

Thank you for the fast response!

Regards,
Lukas
--~--~-~--~~~---~--~~
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: element-wise multiplication of matrices

2009-06-08 Thread Jason Grout

Dan Drake wrote:
 On Sun, 07 Jun 2009 at 11:12AM -0700, paramaniac wrote:
 Is there a possibility/workaround in Sage to compute the element-wise
 multiplication of two matrices? In Matlab there's the .* operator, but
 Matlab is useless in my case since I need a symbolic result.
 
 There's no operator that I know of for that, but you can convert your
 matrices to lists, multiply, and convert back:
 
 sage: x,y,z,w = var('x y z w')
 sage: a = matrix(SR, 2, 2, [x, y, z, w])
 sage: b = matrix(SR, 2, 2, [1+x, 1+y, 1+z, 1+w])
 sage: a.list()
 [x, y, z, w]
 sage: b.list()
 [x + 1, y + 1, z + 1, w + 1]
 
 Now make a list of corresponding pairs of entries with zip() and
 multiply:
 
 sage: [ x*y for x, y in zip(a.list(), b.list()) ]
 [(x + 1)*x, (y + 1)*y, (z + 1)*z, (w + 1)*w]
 
 ...and make a matrix out of the new list:
 
 sage: matrix(2, 2, [ x*y for x, y in zip(a.list(), b.list()) ])
 
 [(x + 1)*x (y + 1)*y]
 [(z + 1)*z (w + 1)*w]
 
 You can easily put that sequence of steps into a function. You may need
 to fiddle a bit with the rows and columns bits, and maybe add a ring
 argument if you need to specify what ring the matrix should be over.
 
 def componentwise_multiply(a, b, rows, cols):
 return matrix(rows, cols, [x*y for x, y in zip(a.list(), b.list())])

You can also turn this into a custom infix operator, if you want.  That 
would mean that your code would depend on a definition, but it could 
make your function a lot easier to use.  See 
http://sagenb.org/home/pub/565 for an example using the above code. 
This is based on the code developed in the thread 
http://groups.google.com/group/sage-devel/browse_thread/thread/100de89e7d402134/fe89570b403344ae
 


(that code probably should get into Sage; it makes some calculations 
very, very easy to write down...)

The trac ticket for incorporating this decorator is 
http://trac.sagemath.org/sage_trac/ticket/6245

Thanks,

Jason






--~--~-~--~~~---~--~~
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: element-wise multiplication of matrices

2009-06-08 Thread kcrisman



 This is based on the code developed in the 
 threadhttp://groups.google.com/group/sage-devel/browse_thread/thread/100de8...

 (that code probably should get into Sage; it makes some calculations
 very, very easy to write down...)

 The trac ticket for incorporating this decorator 
 ishttp://trac.sagemath.org/sage_trac/ticket/6245

There are lots of good uses for something like this, e.g. I could have
used this for teaching Dirichlet products this past semester.  If
something like this ever got into Sage, would it only be for private
use as detailed above, or could some custom infix operators
potentially become standard like the backslash, which only works for
things with the _backslash_ defined (presumably only matrix/vector
combos)?

- kcrisman
--~--~-~--~~~---~--~~
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: element-wise multiplication of matrices

2009-06-08 Thread Jason Grout

kcrisman wrote:
 
 
 This is based on the code developed in the 
 threadhttp://groups.google.com/group/sage-devel/browse_thread/thread/100de8...

 (that code probably should get into Sage; it makes some calculations
 very, very easy to write down...)

 The trac ticket for incorporating this decorator 
 ishttp://trac.sagemath.org/sage_trac/ticket/6245
 
 There are lots of good uses for something like this, e.g. I could have
 used this for teaching Dirichlet products this past semester.  If
 something like this ever got into Sage, would it only be for private


If you polish it up into a patch, I'll review it (so hopefully it gets 
into 4.0.2)!  Hmmm...or maybe I shouldn't review it, being one of the 
authors...



 use as detailed above, or could some custom infix operators
 potentially become standard like the backslash, which only works for
 things with the _backslash_ defined (presumably only matrix/vector
 combos)?


Only time will tell.  I think it's safe to say it would be available for 
private use.  Frankly, I'm a bit surprised that we have the backslash 
operator.  It's a bow to matlab (I assume), but there are lots and lots 
of other matlab operators we don't have.  Sage has (rightfully) been 
very conservative about language additions.

However, I can see a sage.misc.infix module (or even specific modules, 
like sage.graphs.infix) containing a bunch of nice infix operators, not 
defined by default, but that someone could then import.  That would help 
standardize some things if people used them a lot.

Jason



-- 
Jason Grout


--~--~-~--~~~---~--~~
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~--~~~~--~~--~--~---



[sage-support] Re: element-wise multiplication of matrices

2009-06-07 Thread Dan Drake
On Sun, 07 Jun 2009 at 11:12AM -0700, paramaniac wrote:
 Is there a possibility/workaround in Sage to compute the element-wise
 multiplication of two matrices? In Matlab there's the .* operator, but
 Matlab is useless in my case since I need a symbolic result.

There's no operator that I know of for that, but you can convert your
matrices to lists, multiply, and convert back:

sage: x,y,z,w = var('x y z w')
sage: a = matrix(SR, 2, 2, [x, y, z, w])
sage: b = matrix(SR, 2, 2, [1+x, 1+y, 1+z, 1+w])
sage: a.list()
[x, y, z, w]
sage: b.list()
[x + 1, y + 1, z + 1, w + 1]

Now make a list of corresponding pairs of entries with zip() and
multiply:

sage: [ x*y for x, y in zip(a.list(), b.list()) ]
[(x + 1)*x, (y + 1)*y, (z + 1)*z, (w + 1)*w]

...and make a matrix out of the new list:

sage: matrix(2, 2, [ x*y for x, y in zip(a.list(), b.list()) ])

[(x + 1)*x (y + 1)*y]
[(z + 1)*z (w + 1)*w]

You can easily put that sequence of steps into a function. You may need
to fiddle a bit with the rows and columns bits, and maybe add a ring
argument if you need to specify what ring the matrix should be over.

def componentwise_multiply(a, b, rows, cols):
return matrix(rows, cols, [x*y for x, y in zip(a.list(), b.list())])


Dan

-- 
---  Dan Drake dr...@kaist.edu
-  KAIST Department of Mathematical Sciences
---  http://mathsci.kaist.ac.kr/~drake


signature.asc
Description: Digital signature