假设我有大小为 [4, 4]
的矩阵 P将(块)划分为 4 个较小的矩阵 [2,2]
.我该怎么办 高效 将此块矩阵乘以另一个矩阵(不是分区矩阵而是更小)?
让我们假设我们的原始矩阵是:
P = [ 1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4]
其中拆分为子矩阵:
P_1 = [1 1 , P_2 = [2 2 , P_3 = [3 3 P_4 = [4 4
1 1] 2 2] 3 3] 4 4]
现在我们的 P 是:
P = [P_1 P_2
P_3 p_4]
在下一步中,我想在 P 和较小的矩阵之间进行元素乘法,其大小等于子矩阵的数量:
P * [ 1 0 = [P_1 0 = [1 1 0 0
0 0 ] 0 0] 1 1 0 0
0 0 0 0
0 0 0 0]
最佳答案
您可以考虑以更有效的方式表示大型块矩阵。
例如,块矩阵
P = [ 1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4]
可以用
a = [ 1 0 b = [ 1 1 0 0 p = [ 1 2
1 0 0 0 1 1 ] 3 4 ]
0 1
0 1 ]
作为
P = a @ p @ b
用(
@
表示矩阵乘法)。矩阵 a
和 b
表示/编码 P
的块结构和小p
表示每个块的值。现在,如果你想乘(按元素)
p
使用小 (2x2) 矩阵 q
你只是a @ (p * q) @ b
一个简单的pytorch示例
In [1]: a = torch.tensor([[1., 0], [1., 0], [0., 1], [0, 1]])
In [2]: b = torch.tensor([[1., 1., 0, 0], [0, 0, 1., 1]])
In [3]: p=torch.tensor([[1., 2.], [3., 4.]])
In [4]: q = torch.tensor([[1., 0], [0., 0]])
In [5]: a @ p @ b
Out[5]: tensor([[1., 1., 2., 2.], [1., 1., 2., 2.], [3., 3., 4., 4.], [3., 3., 4., 4.]])
In [6]: a @ (p*q) @ b
Out[6]: tensor([[1., 1., 0., 0.], [1., 1., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
我把它留给你作为练习如何有效地产生“结构”矩阵
a
和 b
给定块的大小。
关于tensorflow - tensorflow 或pytorch中的分区矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56601115/