如何在函数中修改数组?

nim*_*cap 14 matlab pass-by-reference pass-by-value

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

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

Jon*_*nas 10

你有三个选项,但也许你不需要它们,因为Matlab使用'copy-on-write',即变量只有在你修改它们时才被复制.

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

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


Mik*_*ail 6

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

如果没有尾调用优化,使用递归是没有效率的,而且我知道MATLAB没有它,但每次递归都可以转换成循环.