稀疏矩阵加速倍频程
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,这往往不是默认值),我个人的经验是,这主要是实验性的,除了最简单的循环之外可能不会做太多事情(参见 )。
我有一个循环,其中“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,这往往不是默认值),我个人的经验是,这主要是实验性的,除了最简单的循环之外可能不会做太多事情(参见