Algorithm 压缩矩阵乘法

Algorithm 压缩矩阵乘法,algorithm,matrix,matrix-multiplication,Algorithm,Matrix,Matrix Multiplication,当在一些实域中乘以矩阵时(就像我现在所做的),这些矩阵包含很多系统重复的值。重复的值不仅为零,所以我们不能称之为稀疏(?) 例如,让我们以这个矩阵为例(在我的例子中,尺寸是1000 x 1000): 然后我们将这个矩阵乘以一个值矩阵,得到一个结果。例如,我们只是乘以向量V{v1,v2,v3,v4}。我们可以做普通的matmul,但这是浪费。我们可以压缩矩阵: A1 = 0.8 * (v1 + v2 + v3) A2 = 0.7 * (v2 + v3 + v4) 并将该值一次又一次地添加到点

当在一些实域中乘以矩阵时(就像我现在所做的),这些矩阵包含很多系统重复的值。重复的值不仅为零,所以我们不能称之为稀疏(?) 例如,让我们以这个矩阵为例(在我的例子中,尺寸是1000 x 1000):

然后我们将这个矩阵乘以一个值矩阵,得到一个结果。例如,我们只是乘以向量V{v1,v2,v3,v4}。我们可以做普通的matmul,但这是浪费。我们可以压缩矩阵:

 A1 = 0.8 * (v1 + v2 + v3)
 A2 = 0.7 * (v2 + v3 + v4)
并将该值一次又一次地添加到点积列中。 如果有大量重复,计算量可以减少几倍。
但在我看来,有效实施似乎很难。你能提出一些建议吗?

你可以把你的矩阵分解成稀疏矩阵的和

0.8 0.8 0.8 0.1 0.1         1 1 1 0 0         0 0 0 0 0   0   0   0   0.1 0.1
0.8 0.8 0.8 0.7 0.7 = 0.8 * 1 1 1 0 0 + 0.7 * 0 0 0 1 1 + 0   0   0   0   0
0.8 0.8 0.8 0.7 0.7         1 1 1 0 0         0 0 0 1 1   0   0   0   0   0
0.9 0.6 0.5 0.7 0.7         0 0 0 0 0         0 0 0 1 1   0.9 0.6 0.5 0   0

然后,乘法就变成了一系列相对简单的乘法和最后的一个大加法。

将它们拆分为块矩阵,并修改乘法向量。您可能需要一个数据结构来跟踪重组情况。

事实上,我们可以将其分解为几个密集矩阵,这些矩阵更快+稀疏和映射或类似的东西
0.8 0.8 0.8 0.1 0.1         1 1 1 0 0         0 0 0 0 0   0   0   0   0.1 0.1
0.8 0.8 0.8 0.7 0.7 = 0.8 * 1 1 1 0 0 + 0.7 * 0 0 0 1 1 + 0   0   0   0   0
0.8 0.8 0.8 0.7 0.7         1 1 1 0 0         0 0 0 1 1   0   0   0   0   0
0.9 0.6 0.5 0.7 0.7         0 0 0 0 0         0 0 0 1 1   0.9 0.6 0.5 0   0