让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)可以尽可能减少矩阵乘法的数量?
答案 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 :(得分: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次乘法(如果我的数学是正确的)。