torch.tensor 中A*B与A@B的区别

假设

A = [a11,a12,...a1n,
     ...
     am1,am2,...amn]
# m*n
B = [b11,b12,...b1n,
     ...
     bm1,bm2,...bmn]
# m*n
C = [c11,c12,...b1k,
     ...
     bn1,bn2,...bnk]
# n*k

A*B要求两矩阵维度相同,其结果为对应位置元素相乘,我查了一下,有叫其为哈达玛积的

A@C就是矩阵的乘法

那么A*B,与A@C分别为

A*B=[a11*b11,a12*b12,...,a1n*b1n
     ...
     am1*bm1,am2*bm2,...,amn*bmn]
# (m*n)*(m*n) = (m*n)
A@C=[a11*c11+a12*c21+...+a1n*cn1,...,a11*c1k+a12*c2k+...+a1n*cnk
     ...
     am1*c11+am2*c21+...+amn*cn1,...,am1*c1k+am2*c2k+...+amn*cnk]
# (m*n)@(n*k) = (m*k)

此处附上示例代码

A = torch.tensor([0,1,0,1,0,1]).reshape(2,-1)
B = torch.tensor([1,2,4,8,16,32]).reshape(2,-1)
C = B.T #转置
print(A.shape,B.shape,C.shape)
print(A*B,A@C,sep='\n')

# -------------结果----------------
# torch.Size([2, 3]) torch.Size([2, 3]) torch.Size([3, 2])
# tensor([[ 0,  2,  0],
#         [ 8,  0, 32]])
# tensor([[ 2, 16],
#         [ 5, 40]])

补充:由于tensor广播机制的存在,当A(am*an)*B(bm*bn),当bm和bn有其中一个为1,而另外一个的值与A矩阵中对应的维度的长度一致时,也可以相乘,即以下情况时可以相乘的:

A(m*n)*B(m*1),A(m*n)*B(1*n),A(m*n)*B(1*1)

结果为将B重复到与A的维度一致,然后再求其哈达玛积

示例:

A = torch.randn(6,8)
B = torch.randn(1)
C = B.repeat(6,1)
D = B.repeat(6,8)
E = torch.randn(8).reshape(1,-1)
F = E.repeat(6,1)
print(A.shape,B.shape,C.shape,D.shape,E.shape,F.shape)
print((A*B!=A*C).sum(),(A*B!=A*D).sum(),(A*E!=A*F).sum())

# ---------结果-------------
# torch.Size([6, 8]) torch.Size([1]) torch.Size([6, 1]) torch.Size([6, 8]) 
# torch.Size([1, 8]) torch.Size([6, 8])
# tensor(0) tensor(0) tensor(0)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值