如何解决稀疏矩阵以加快倍频程
我有一个循环,其中“i”取决于“i-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 在评论中提到的,如果此方法对您不起作用,您有机会以其他方式优化您的循环(甚至循环解决方案一开始可能不一定很慢) .
顺便说一句,理论上,Octave 像 matlab 一样提供 jit-speedup,但与 matlab 不同的是,您需要显式启用它(从某种意义上说,您需要使用 jit 选项编译您的八度音程,这往往不是默认设置) ),而我的个人经验是,这主要是实验性的,除了最简单的循环外,可能不会做太多事情(请参阅 this post)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。