Python 2D乘以2D等于3d pytorch张量

Python 2D乘以2D等于3d pytorch张量,python,pytorch,matrix-multiplication,Python,Pytorch,Matrix Multiplication,给定两个二维pytorch张量: A=torch.FloatTensor([[1,2],[3,4]) B=火炬.浮标张量([[0,0],[1,1],[2,2]] 是否有一种有效的方法来计算形状张量(6,2,2),其中每个条目是a的列乘以B的每行 例如,对于上面的A和B,3D张量应具有以下矩阵: [[0,0], [0, 0]], [[1, 1], [3, 3]], [[2, 2], [6, 6]], [[0, 0], [0, 0]], [[2, 2], [4, 4]], [[4, 4], [8,

给定两个二维pytorch张量:

A=torch.FloatTensor([[1,2],[3,4])
B=火炬.浮标张量([[0,0],[1,1],[2,2]]
是否有一种有效的方法来计算形状张量(6,2,2),其中每个条目是
a
的列乘以
B
的每行

例如,对于上面的A和B,3D张量应具有以下矩阵:

[[0,0],
[0, 0]],
[[1, 1],
[3, 3]],
[[2, 2],
[6, 6]],
[[0, 0],
[0, 0]],
[[2, 2],
[4, 4]],
[[4, 4],
[8, 8]]]
我知道如何通过for循环来实现,但我想知道是否有一种有效的方法来保存它。

Pytorch张量实现,它将解决这个问题

这个问题不清楚你是想执行矩阵乘法还是元素乘法。在长度2的情况下,你展示了两者是等价的,但对于更高的维度,这肯定不是真的!谢天谢地,代码几乎相同,所以我只给出两个选项

A=torch.FloatTensor([[1,2],[3,4])
B=火炬.浮标张量([[0,0],[1,1],[2,2]]
#矩阵乘法
C_mm=(A.T[:,无,:,无]@B[无,:,无,:])。展平(0,1)
#元素乘法
C_ew=(A.T[:,无,:,无]*B[无,:,无,:])。展平(0,1)

代码描述。A.T转置A,使用None的索引插入单一维度,因此A.T[:,None,:,None]将是形状(2,1,2,1)B[None,:,None,:]是形状(1,3,1,2)。由于
@
(矩阵乘法)对张量的最后两个维度进行运算,并广播其他维度,因此结果是
A
的每一列乘以
B
的每一行的矩阵乘法。在元素方面的情况下,在每个维度上执行广播。结果是一个
(2,3,2,2)
张量。要把它变成一个
(6,2,2)
张量,我们只需要用

将前两个维度展平。你是指矩阵乘法还是广播元素乘法?当A和B的行和列的长度为2时,两者给出相同的结果。谢谢。这部分解决了我的大问题。