如何减少矩阵乘法的数量

时间:2017-09-26 01:52:04

标签: algorithm performance matrix optimization

A为给定的方形矩阵,其大小为nxn。设A[i]表示通过将nxn i列替换为零列向量而形成的A矩阵。

现在我想计算以下(n^4+n^3+n^2)矩阵产品:

{A[x]*A[y]*A[z]*A[w] | for all x=1,...n , y=1,...,n , z=1,...n, and w=1,...,n}

{A[y]*A[z]*A[w] | for all y=1,...,n , z=1,...n, and w=1,...,n}

{A[z]*A[w] | for all z=1,...n, and w=1,...,n}

如果我天真地计算每个产品,则需要O((n^4+n^3+n^2)*n^3)时间复杂度(假设矩阵乘法需要O(n^3)时间)。

但是,我注意到有许多可以记忆的重复乘法。是否有一种有效的方法(如DP)可以尽可能减少矩阵乘法的数量?

2 个答案:

答案 0 :(得分:0)

第一个 - 显而易见 - 优化是使用第3组的结果来计算第一组。

第二个想到的是稍微有点棘手。

B[i]表示nxn 0矩阵,其中i - 列替换为i - A列{iow {{1} })。

然后使用矩阵分布法[1]重写矩阵乘积,就像这样。 B[i] = A - A[i]

由于A[x]*A[y] = (A - B[x])(A - B[y]) = (A - B[x])A - (A - B[x])B[y] = AA - B[x]A - AB[y] - B[x]B[y]是只有一个非零列的稀疏矩阵,因此上面的产品非常容易计算,加上一个" full"矩阵乘法 - B[i] - 只需要计算一次。

3乘法的情况如下所示。 AA

在上一步之后,我们已经有了大部分因素(每A[x]*A[y]*A[z] = AAA - B[x]AA - AB[y]A + B[x]B[y]A - AAB[z] + B[x]AB[z] + AB[y]B[z] + B[x]B[y]B[z]B[i]A),如果内存无关紧要;或者我们可以轻松地计算它(因为AB[i]再次稀疏)。

然后可以通过类似的方式完成4倍的情况。

[1] https://en.wikipedia.org/wiki/Matrix_multiplication#Properties_of_the_matrix_product_.28two_matrices.29

答案 1 :(得分:0)

将A [z]和A [w]相乘,在每次迭代中跳过w中的'0'列,然后简单地在答案中用零填充该列(或者如果你调用了内存,那么它默认情况下已经为0)。这是你的问题#3

现在,取这个矩阵,其列为零(第列),并将A [y]乘以它,再次利用同一列为零的事实,您可以跳过乘法。你现在有#2。

再次使用此结果再次乘以A [x],利用相同的0列。

这意味着整体而言,你有3 *(n-1)* n *(2n)= 6 * n ^ 3 - 6 * n ^ 2次乘法(如果我的数学是正确的)。