Matlab 如何在函数中修改数组?

Matlab 如何在函数中修改数组?,matlab,pass-by-reference,pass-by-value,Matlab,Pass By Reference,Pass By Value,MATLAB是一种传递值语言。我有一个递归函数来处理像素的邻域。每次调用函数时复制图像(在我的例子中是两个图像)是非常昂贵的 我用全局变量来解决这个问题。是否有其他方法使递归函数修改数组?如果将递归函数设置为存储图像数据的另一个函数中的一个,则递归函数可以修改图像数据。MATLAB并不总是按值传递,在某些情况下,较新版本的MATLAB会按引用传递,请参阅和有关MATLAB内存管理的更一般性的讨论 如果没有它,使用递归是低效的,据我所知,MATLAB没有递归,但是每个递归都有。您在这里有三个选项,

MATLAB是一种传递值语言。我有一个递归函数来处理像素的邻域。每次调用函数时复制图像(在我的例子中是两个图像)是非常昂贵的


我用全局变量来解决这个问题。是否有其他方法使递归函数修改数组?

如果将递归函数设置为存储图像数据的另一个函数中的一个,则递归函数可以修改图像数据。

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


如果没有它,使用递归是低效的,据我所知,MATLAB没有递归,但是每个递归都有。

您在这里有三个选项,但您可能不需要它们中的任何一个,因为MATLAB使用了“写时复制”,即只有修改变量时才复制变量

  • 如前所述,您可以使用。嵌套函数内部使用的变量在嵌套函数和封闭函数之间共享。嵌套函数调试起来有点棘手,编写/理解起来有点复杂
  • 您可以将图像存储为通过引用传递的属性
  • 为了不使用递归函数,您可以编写不同的代码,因为Matlab不是使用递归函数的最佳语言。如果可以访问图像处理工具箱,则可以使用函数,如,或重写函数

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

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


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

    返回修改后的数组,请参阅MathWorks的“技术解决方案”:这是文档中的相关部分:@Amro:谢谢,添加了指向我的答案的链接。嵌套函数,处理对象,etc与数组上的写上复制是正交的,因此这并不能解决问题。