稀疏矩阵加速倍频程

Sparse matrix to speed up octave

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

您指的是 this technique, as referenced from this (rather old) how to speed up octave 文章。

如果 link 将来死去,我会在这里重述要点。

假设您有以下循环:

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是一个已知向量,这使得上述问题成为一个简单的问题,可以通过简单的矩阵除法运算来解决,保证速度很快。


话虽如此,大概这个 'trick' 只有在您能够首先以这种方式重铸问题时才有用。据推测,这只会是您未知的线性问题的情况。我不认为这一定可以用于更复杂的循环。

此外,正如 Cris 在评论中提到的,如果此方法对您不起作用,您有机会以其他方式优化您的循环(或者甚至循环解决方案在第一个阶段不一定很慢地方)。

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