假设
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)