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
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
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