微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

稀疏矩阵以加快倍频程

如何解决稀疏矩阵以加快倍频程

我有一个循环,其中“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 举报,一经查实,本站将立刻删除。