You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:25:37