在矩形矩阵上划分和征服

时间:2015-11-21 22:04:46

标签: algorithm matrix divide-and-conquer

我为这个问题的模糊性道歉,但我正试图找出一种方法来执行除法和征服矩形矩阵A和B的乘法,使得A = n x m和B = m x p

我已经完成了一些阅读,而Strassen的方法看起来很有希望,但我无法确定如何在矩形矩阵上使用此算法。我已经看到有些人用零填充“padding”来使两个矩阵成为正方形然后“取消填充”结果,但我不清楚unpadding阶段会带来什么。

感谢您的建议!

1 个答案:

答案 0 :(得分:1)

结果矩阵将在“添加”到操作数矩阵的所有项目上包含零。要返回矩形结果,您只需裁剪结果,即根据操作数的维度获取结果矩阵的左上角。

然而,仅在n,m和p非常接近的情况下,填充本身似乎是明智的。当这些不成比例时,你会进行大量的零矩阵乘法。

例如,如果n = 2m = p,Strassen的算法将乘法划分为m个矩阵的7次乘法。然而,这些乘法中的4个将涉及零矩阵并且不是必需的。

我认为有两种方法可以改善效果:

  • 使用填充并记住填充矩阵的哪个部分。然后,对于每个乘法步骤,检查您是否没有乘以零矩阵。如果这样做,结果也将是一个零矩阵,无需计算。这将消除填充所涉及的大部分成本。
  • 不要使用填充。 NonSquare_Strassen:将矩形矩阵划分为正方形区域和余数。在方形区域上运行vanilla Strassen。在余数上再次运行NonSquareStrassen。然后,结合这些结果。这种算法很可能比第一种算法更快,但并不容易实现。但是,逻辑与Strassen的方形矩阵算法非常相似。

为简单起见,我会选择第一个选项。

注意: 请记住,您也可以将Strassen方法用于矩形矩阵,并且在某些矩阵大小以下,额外矩阵加法的O(n ^ 2)成本变得更加显着,并且使用常规三次乘法完成小尺寸会更好。这意味着Strassen的方法对于非方形矩阵仍然很容易实现。以上期望您已经实现了方形矩阵的算法。