有没有任何方法可以将矩阵乘以O(n)复杂度?

时间:2009-12-22 07:01:42

标签: c++ c matrix big-o

我想将两个矩阵相乘,但三重循环具有O(n 3 )复杂度。动态规划中是否存在将两个矩阵与O(n)复杂度相乘的算法?

好的,我们不能得到最好的O(n 2.81

编辑,但有没有任何解决方案甚至可以将结果逼近某些特定的号码。矩阵的列和行

我的意思是我们得到O(n 2.81 )中最好的一个复杂的解,但结果很完​​美但是如果有任何解决方案甚至近似矩阵的乘法,因为我们有因式近似的公式等

如果你知道它会帮助我

问候。

8 个答案:

答案 0 :(得分:40)

目前已知的最佳矩阵乘法算法是 "Coppersmith-Winograd algorithm" O(n 2.38 复杂但它 用于实际目的。

但是,您总是可以使用 "Strassen's algorithm" ,其 O(n 2.81 复杂度但是没有这样的已知算法矩阵乘法与O(n)复杂度。

答案 1 :(得分:14)

在O(n ^ 2)处存在矩阵乘法的理论下界,因为您必须触摸许多存储器位置来进行乘法。正如其他人所说,有些算法将我们降低到O(n ^ 3)以下,但在实际使用中通常是不切实际的。

如果您需要加快速度,可能需要查看Cache Oblivious Algorithms,例如这一算法(http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.44.5650),它通过以缓存一致的方式执行操作来加速性能,确保数据在需要时缓存。

答案 2 :(得分:8)

简答:否

长答案:如果你有特殊类型的基质(例如对角矩阵),有很多方法。更好的矩阵乘法算法可以减少像O(n 2.4 )(http://en.wikipedia.org/wiki/Coppersmith-Winograd_algorithm)这样的东西。我熟悉的主要方法是使用分而治之算法来分割工作量(而不是我链接的工作负载)。

我希望这有帮助!

答案 3 :(得分:2)

如果已知矩阵是对角线,则可以在O(N)运算中将它们相乘。但总的来说,你不能。

答案 4 :(得分:2)

矩阵具有O(n 2 )元素,并且每个元素必须至少考虑一次才能得到结果,因此矩阵乘法算法无法在小于O的情况下运行( n 2 )操作。

答案 5 :(得分:1)

如果

  • 你的矩阵很大
  • 他们有很多零
  • 您愿意以奇怪的格式存储它们

您可以设计算法,其复杂性仅取决于非零元素的数量。对于某些问题(例如有限元方法),这可能是强制性的。

答案 6 :(得分:0)

没有!我不这么认为。

除非您使用并行处理机,否则没有办法。它也有自己的依赖性和局限性。

到目前为止,尚未实现。

答案 7 :(得分:0)

如果你有处理器和共享读存储器架构,你可以在O(n)时间内将两个矩阵相乘......但这只是现在的理论。