14

MATLAB 是一种按值传递的语言。我有一个处理像素邻居的递归函数。每次调用函数时制作图像的副本(在我的情况下是两个图像)非常昂贵。

我使用全局变量来解决问题。有没有其他方法可以使递归函数修改数组?

4

4 回答 4

10

您在这里有三个选项,但也许您不需要其中任何一个,因为 Matlab 使用“写时复制”,即只有在您修改变量时才会复制变量。

  1. 正如@gnovice提到的,您可以使用嵌套函数。嵌套函数内部使用的变量在嵌套函数和封闭函数之间共享。嵌套函数调试起来有些棘手,编写/理解起来也有点复杂。
  2. 您可以将图像存储为通过引用传递的句柄对象的属性。
  3. 为了不使用递归函数,您可以编写不同的代码,因为 Matlab 不是使用这些函数的最佳语言。如果您有权访问图像处理工具箱,则可以使用类似的函数blockproc,或im2col重写该函数。

最后,如果您想继续使用当前的方案,我强烈建议您使用持久变量而不是全局变量。

于 2010-11-09T20:21:23.990 回答
6

MATLAB 并不总是按值传递,较新版本的 MATLAB 在某些情况下会按引用传递,请参阅此 SO 帖子中的就地操作和有关 MATLAB 内存管理的更一般性讨论。

如果没有尾调用优化,使用递归是低效的,据我所知,MATLAB 没有它,但每个递归都可以转换为循环

于 2010-11-09T20:21:17.117 回答
3

如果您使递归函数成为存储图像数据的另一个函数中的嵌套函数,则递归函数可以修改图像数据而无需将其传递给它

于 2010-11-09T20:07:00.780 回答
2

这是一个普遍的误解。尽管 MATLAB 的 sytanx 是按值传递的,但它实际上并不像在 C 中那样按值传递。解释器足够聪明,只在必要时进行复制。所以你应该继续按值传递,看看你是否遇到内存问题。

正如其他海报所指出的那样,无论如何您都应该尽量避免在 MATLAB 中使用递归。

于 2010-11-10T14:54:58.840 回答