【问题标题】:Vetctorizing recursion or iteration in Matlab在 Matlab 中向量化递归或迭代
【发布时间】:2012-08-29 17:59:23
【问题描述】:

假设我有一个元素为 1...n 的向量 v,并且我知道 v(1) = v_0,然后

v(i+1) = 1/(a*v(i) + b). 

这很容易使用单个 for 循环或递归来实现。递归在 Matlab 中是一个糟糕的想法,如果可能的话,单个 foo 循环仍然不是最优的。我可以向量化这样的操作吗?

为了让这篇文章更有用,有没有一种通用的矢量化方法

v(i+1) = f(v(i)), 

其中 f(x) 是任意函数?像

这样的东西呢
v(i+1) = a(i)*v(i) + b(i)

其中 a 和 b 现在是向量。

【问题讨论】:

  • 向量化是为了对向量的所有元素“并行化”一个类似的操作——这里,一个单元格的结果取决于它之前的所有单元格,所以向量化不是这里的方法。

标签: matlab


【解决方案1】:

由于即时编译,for 循环在 MATLAB 中没有以前那么糟糕了。如有疑问,只需编写循环并继续您的工作。除非您的向量很大,否则循环不会打扰您。如果(且仅当)循环是瓶颈,请返回并尝试愚蠢的 MATLAB 技巧进行优化。

在对您的问题的具体回答中,不,我认为没有通用的方式来表达 v(i+1) = f(v(i))。您可以使用函数句柄轻松编写一个,但性能将比仅仅对表达式进行开放编码要少。

【讨论】:

  • 我很担心。在这种情况下,最大的瓶颈是原始问题的更复杂版本。然后循环多次,因此一个小的加速会导致速度显着增加。我认为没有办法,但值得一问。谢谢!
  • 我应该提到filter 的特殊情况(由于1/,它不适合您的问题)。还有两种可能性:1. 有时递归定义可以扩展为封闭形式的表达式 2. 您可以用 C 代码编写函数并通过 MEX 文件调用它。
猜你喜欢
  • 1970-01-01
  • 2020-12-17
  • 2011-08-05
  • 1970-01-01
  • 2015-03-16
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多