【问题标题】:Sparse matrix to speed up octave稀疏矩阵加速八度
【发布时间】:2021-09-21 15:34:54
【问题描述】:

我有一个循环,其中“i”取决于“i-1”值,所以我无法对其进行矢量化。 我读过我可以使用稀疏矩阵来对其进行矢量化,从而加快我的代码速度,但我不明白这是如何工作的。 有什么帮助吗? 谢谢

【问题讨论】:

  • 稀疏矩阵可用于表示其中包含大量零元素的矩阵。他们允许向量化没有它们就无法向量化的代码是没有意义的。无论如何,MATLAB 中的循环在 15 年内一直没有变慢。如果您的循环是您程序中的瓶颈,请向我们展示代码(但请参阅minimal reproducible example),我们可能会有如何加快它的想法。
  • @CrisLuengo 实际上确实有道理;请参阅下面的答案-我很确定这就是 OP 所指的。显然这种方法的适用性是相当有限的,但它仍然是一个相当巧妙的小技巧。
  • 抱歉我的 MATLAB 评论,没有注意并意识到这是标记为 Octave。我的评论的其余部分仍然有效,最后一部分是最重要的:请发布一些代码,以便我们尝试加快速度。

标签: performance vectorization octave sparse-matrix


【解决方案1】:

您指的是this technique,正如这篇(相当老的)how to speed up octave 文章所引用的那样。

我将在这里重新表述要点,以防将来链接失效。

假设你有以下循环:

p1(1) = 0;

for i = 2 : N
    t     = t + dt;
    p1(i) = p1(i - 1) + dt * 2 * t;
endfor

您注意到,纯粹从数学的角度来看,循环中的最后一步可以改写为:

-1 * p1(i - 1) + 1 * p1(i) = dt * 2 * t

通过将 p1 视为未知数的向量,将循环的每次迭代视为(稀疏)方程组中的一行,这使得将问题重铸为稀疏矩阵求解成为可能。例如:

鉴于t 是一个已知向量,这使得上述问题成为一个简单的问题,可以通过简单的矩阵除法运算来解决,保证速度很快。


话虽如此,想必这个“技巧”只有在你能够以这种方式重铸问题的情况下才有用。据推测,这仅适用于您未知的线性问题。我认为这不一定可以用于更复杂的循环。

此外,正如 Cris 在 cmets 中提到的,如果此方法不适合您,您有机会以其他方式优化您的循环(甚至循环解决方案一开始可能不一定很慢) .

顺便说一下,从理论上讲,Octave 像 matlab 一样提供 jit-speedup,但与 matlab 不同的是,您需要显式启用它(在某种意义上,您需要使用 jit 选项编译您的 octave,这往往不是默认选项),而我个人的经验是,这主要是实验性的,除了最简单的循环(参见this post)之外,可能不会做太多事情。

【讨论】:

  • 当然,如果您可以将问题写成具有大量零的线性方程组,那么稀疏矩阵会很有帮助。很公平。写得不错!
  • 这正是我的意思。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多