矩阵按元素相乘

7

在sympy库中,使用matrix_multiply_elementwise函数是否可以对超过两个矩阵进行逐元素相乘?还有其他方法可以对多个矩阵进行逐元素相乘吗?

p.s. 在numpy中很容易实现,但由于我需要高精度计算,所以我决定使用sympy。

3个回答

7
你想要查找的是Hadamard乘积(或Schur乘积)。
在sympy中,它可以通过sympy.matrices.dense.matrix_multiply_elementwise(A, B)实现,文档在这里

感谢您的评论。看起来这个语法只适用于两个矩阵,而不能适用于更多! - Hesam SoltanpanahiSarabi
是的,但你可以嵌套地做。或者编写自己的函数,多次调用Hadamard乘积。或者查看sympy函数的源代码:http://docs.sympy.org/latest/_modules/sympy/matrices/dense.html#matrix_multiply_elementwise 它非常简短,也许你可以用它来编写适用于任意数量矩阵的Hadamard乘积。 - laolux

0
这里有一种方法可以对三个矩阵进行逐元素相乘。这个解决方案可以推广到多于三个矩阵或者其他函数的情况下使用。
from sympy import Matrix, pprint

a = Matrix([[1,2],[3,4]])
b = Matrix([[1,10],[100,1000]])
c = Matrix([[-1,1],[1,-1]])
x = Matrix(2,2, lambda i,j,m1=a,m2=b,m3=c: m1[i,j]*m2[i,j]*m3[i,j])

pprint(a)
pprint(b)
pprint(c)
pprint(x)

为了简单起见,此解决方案适用于2X2形状的矩阵,但可以轻松地适应其他大小(使用形状属性)

以下是输出结果

⎡1  2⎤
⎢    ⎥
⎣3  4⎦
⎡ 1    10 ⎤
⎢         ⎥
⎣100  1000⎦
⎡-1  1 ⎤
⎢      ⎥
⎣1   -1⎦
⎡-1    20  ⎤
⎢          ⎥
⎣300  -4000⎦

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接