tensorflow - tensorflow 或pytorch中的分区矩阵乘法

标签 tensorflow matrix pytorch matrix-multiplication multiplication

假设我有大小为 [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

用( @ 表示矩阵乘法)。矩阵 ab表示/编码 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.]])


我把它留给你作为练习如何有效地产生“结构”矩阵 ab给定块的大小。

关于tensorflow - tensorflow 或pytorch中的分区矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56601115/

相关文章:

python - 如果在 tensorflow 中满足条件,则将数字添加到张量等级 1 中的元素

python - 将索引选择的 numpy 数组添加到另一个具有重叠索引的 numpy 数组

arrays - 将向量转换为 3 维矩阵

python - Pytorch:如何找到 2D 张量的每一行中第一个非零元素的索引?

pytorch - 如何在 pytorch 中展平张量?

Python:model.fit() 错误,不支持 None 值

python - 如何实现包含具有不同激活函数的神经元的单个隐藏层?

OpenGL 总是在 cl-opengl(Common Lisp)中为 glGetFloatv GL_MODELVIEW_MATRIX 返回单位矩阵

matlab - 如何判断矩阵是否奇异?

max - 如何有效地检索 Torch 张量中最大值的索引?