文档

避免不必要的数据拷贝

将值传递给函数

当调用带有输入参数的函数时,MATLAB®将调用函数的工作空间中的值复制到被调用函数的参数变量中。然而,MATLAB应用各种技术来避免不必要时复制这些值。

MATLAB不提供一种方法来定义一个值的引用,就像c++语言那样。相反,MATLAB允许多个输出和多个输入参数,这样你就知道函数中有什么值函数中有什么值。

即写即拷

如果函数没有修改输入参数,MATLAB不会复制包含在输入变量中的值。

例如,假设您将一个大数组传递给一个函数。

一个=兰德(1)e7, 1);B = f1 (A);

这个函数f1将输入数组中的每个元素相乘X通过1.1并将结果赋给变量Y

函数Y = f1(X) Y = X *1.1;% X是a的共享副本结束

因为函数不修改输入值,局部变量X和变量一个在调用者的工作区中共享数据。后f1执行赋值一个没有改变。的变量B在调用者的工作区中包含按元素进行乘法的结果。输入通过值传递。但是,在调用时不会进行复制f1

这个函数f2是否修改了输入变量的本地副本,导致本地副本与输入不共享一个.的价值X函数中现在是输入变量的独立副本一个在调用者的工作区中。当f2将结果返回到调用者的工作区,即局部变量X被摧毁。

一个=兰德(1)e7, 1);B = f2 (A);
函数Y = f2(X) X = X *1.1;% X是A的独立副本Y = X;% Y是X的共享副本结束

通过输入为MATLAB表达式

您可以使用函数返回的值作为另一个函数的输入参数。例如,使用the兰德函数创建函数的输入f2直接。

B = f2(兰德(1)e7, 1));

表示返回值的唯一变量兰德为临时变量X在函数的工作空间中f2.在调用者的工作区中没有这些值的共享或独立副本。直接传递函数输出节省了在被调用函数中创建输入值副本所需的时间和内存。当不再使用输入值时,这种方法是有意义的。

分配就地

当您不需要保留原始的输入值时,您可以将函数的输出赋给与输入相同的变量。

一个= f2 (A);

对相同变量名的重新赋值遵循前面描述的“写时复制”行为:修改输入变量值将导致这些值的临时副本。然而,MATLAB可以在一定条件下应用内存优化。

考虑下面的例子。的memoryOptimization函数在变量中创建一个大的随机数数组一个.然后调用局部函数fLocal,通过一个作为输入,并将局部函数的输出赋给相同的变量名。

因为对局部函数的调用,一个= fLocal(一个),将输出赋给变量一个, MATLAB不需要保留的原始值一个在函数执行期间。在fLocal,输入X是否持有该值的唯一副本一个

因此,对其进行了修改X内部fLocal不要导致数据的副本。的任务,X = X * 1.1,修改X在适当的位置,无需为乘法结果分配新数组。

函数A = rand(1e7,1);= fLocal ();结束函数X = fLocal(X) X = X *1.1;结束

消除局部函数中的副本可以节省内存并提高大型数组的执行速度。然而,当函数抛出错误后可以使用变量时,MATLAB不能应用内存优化。因此,这种优化不会应用于脚本、命令行和调用eval,或者在try/catch块中编写代码。

此外,当原始变量可以在被调用函数的执行过程中直接访问时,MATLAB并不应用内存优化。例如,如果fLocal是一个嵌套函数,MATLAB无法应用该优化,因为变量可以与父函数共享。

最后,当赋值变量声明为全局变量或持久化变量时,MATLAB并不应用内存优化。

为什么按值传递语义

MATLAB在向函数传递参数和从函数返回值时使用按值传递语义。在某些情况下,按值传递会导致在被调用的函数中生成原始值的副本。然而,按值传递语义提供了某些优势。

当调用函数时,您知道在调用者的工作空间中没有修改输入变量。因此,您不需要在函数内部或调用站点中复制输入,只是为了防止这些值可能被修改。只修改分配给返回值的变量。

另外,如果在通过引用传递变量的函数中发生错误,还可以避免损坏工作空间变量。

处理对象

有一种特殊的物体叫做处理.持有相同句柄副本的所有变量都可以访问和修改相同的基础对象。句柄对象在表示物理对象(如窗口、绘图、设备或人)而不是数字或矩阵等数学对象的特殊情况下很有用。

类派生的句柄对象处理类,它提供事件和监听器、析构函数方法以及对动态属性的支持等功能。金宝app

有关值和句柄的更多信息,请参见句柄类和值类的比较使用哪种类型的类

另请参阅

相关的话题