使用SymPy计算Hadamard乘积时结果不符合预期的原因
问题原因:代码构造矩阵C的逻辑错误
这不是Hadamard乘积的数学概念问题,完全是你构造矩阵C的代码逻辑不符合预期导致的。
第一个案例的错误拆解
你预期的Hadamard乘积结果是对角矩阵,说明你想要的C应该是主对角线为[10,20,30]、其余元素为0的对角矩阵,但实际代码的构造逻辑完全偏离了这个目标:
C= Matrix(len(M),3,len(M)*D)
len(M)为3,3*D会把列表D重复3次,得到[10,20,30,10,20,30,10,20,30]- SymPy的
Matrix(nrows, ncols, iterable)是按列优先填充元素的,最终生成的C矩阵是:[10, 10, 10] [20, 20, 20] [30, 30, 30]
和单位矩阵A做Hadamard乘积时,自然得不到你想要的对角结果。
第二个案例为什么符合预期?
第二个案例中,你构造的C矩阵是按列填充的3行4列矩阵:
[10, 10, 10, 10] [20, 20, 20, 20] [30, 30, 30, 30]
而你的A矩阵只有前3个对角线位置为1,其余为0,Hadamard乘积(元素对应相乘)后,只有A为1的位置保留C的值,其余为0,刚好符合你的预期。
修正后的第一个案例代码
将C矩阵改为对角矩阵的正确构造方式即可:
import numpy as np from sympy import Matrix, hadamard_product M = [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ] D = [10,20,30] # 构造目标对角矩阵 C = Matrix.diag(*D) A = Matrix(M) B = hadamard_product(A, C) print("1:", B) # 用multiply_elementwise方法效果一致 print("1修正后:", A.multiply_elementwise(C))
运行后输出就是你预期的Matrix([[10, 0, 0], [0, 20, 0], [0, 0, 30]])。
内容的提问来源于stack exchange,提问作者Jack Hsueh
相关产品推荐
相关产品推荐

