主要内容

避免不必要的副本的数据

值传递给函数

当调用一个函数的输入参数,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是一个共享的一个副本结束

因为这个函数不修改输入值,局部变量X和变量一个调用者的工作区中共享数据。后f1执行时,分配到的值一个没有改变。的变量B调用者的工作区中包含element-wise乘法的结果。输入是通过价值。但是,没有副本是由当调用f1

这个函数f2并修改其本地副本的输入变量,导致本地副本与输入非共享一个。的价值X在函数现在是一个独立的输入变量的副本一个在调用者的工作区。当f2将处理的结果返回给调用者的工作空间,局部变量X被摧毁。

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

通过输入为MATLAB表达式

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

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

唯一的变量返回的值兰德是一个临时变量X在函数的工作区f2。没有共同或独立复制的这些值调用者的工作区。直接传递函数输出保存创建的副本所需时间和内存调用函数的输入值。这种方法是有意义的,当输入值不习惯了。

分配就地

当你不需要保留原始的输入值,您可以指定一个函数的输出作为输入提供相同的变量。

一个= f2 (A);

就地作业之前,即写即拷行为前面描述:修改输入变量值在一个临时复制的结果值。

MATLAB在一定条件下可以应用内存优化。考虑下面的例子。的canBeOptimized函数创建一个大的随机数数组变量一个。然后它调用本地函数fLocal,通过一个作为输入,将本地函数的输出分配给相同的变量名。

函数canBeOptimized =兰德(1)e7, 1);= fLocal ();结束函数X = fLocal X = X (X) * 1.1;结束

因为当地的函数的调用,一个= fLocal(一个),分配输出变量一个,MATLAB不需要保留的原始值一个在执行期间的功能。修改了X内部fLocal不会导致数据的一个副本。赋值X = X * 1.1修改X在没有分配一个新数组相乘的结果。消除了副本的本地功能可以节省内存,提高执行速度对于大型数组。

然而,MATLAB不能应用这种优化如果任务在本地函数需要数组索引。例如,修改中创建的单元阵列updatecell需要索引的数组X在当地的函数全球在地化。循环作业的形式我X{我}= {}* 1.1创建一个数据的副本X {}。对细胞的数组,每个元素有两个副本的工作区全球在地化

函数updatecell C = num2cell(兰德(1)e7, 1));C =全球本土化(C);结束函数X =全球本土化(X)i = 1:长度(X) X{我}={我}* 1.1;结束结束

几个额外的限制。MATLAB不能申请内存优化后,可以使用变量的函数将抛出一个错误。因此,这种优化不是应用在脚本中,在命令行上调用eval,或者代码内部try / catch块。同时,MATLAB不适用直接访问内存优化当原始变量在调用函数的执行。例如,如果fLocalMATLAB是一个嵌套函数,不能应用优化因为变量可以与父母分享功能。最后,MATLAB时不使用内存优化分配的变量声明为全局或持久的。

调试代码,使用就地任务

当MATLAB就地优化适用于一个赋值语句,左边的变量的赋值被设置为一个临时状态,使得它无法在MATLAB执行赋值语句的右边。如果MATLAB停止前的调试器执行语句的右侧的结果已经分配给变量,检查左侧变量可以产生一个错误,表明该变量不可用。

例如,该函数有一个尺寸不匹配的变量一个B

函数一个= =原地兰德(100);B =兰德(99);dbstop如果错误= A * B;结束

执行函数将抛出一个错误并停止在调试器中。

原地
矩阵维度必须一致。错误在原地(第5行)= A * B;5 = A * B;

试图看到变量的值一个在调试模式下会导致错误,因为变量是暂时不可用。

K > >
变量”一个“不可访问。当一个变量出现在赋值语句的双方,在处理变量可能会暂时不可用。

为了获得更大的灵活性,当调试、重构您的代码删除就地任务。例如,将结果分配给另一个变量。

函数一个= =原地兰德(100);B =兰德(99);dbstop如果错误% C而不是分配结果C = a * B;一个= C;结束

那么变量是可见的在调试器。

为什么按值传递语义

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

当调用函数时,你知道输入变量不修改调用者的工作区。因此,您不需要复印的输入在一个函数或者调用网站只是为了防范这些值可能被修改。只有变量分配给返回值被修改。

同样,你避免腐蚀的可能性空间变量如果一个错误发生在一个函数,一个变量通过引用传递。

处理对象

有特殊类型的对象处理。所有变量持有相同的副本处理可以访问和修改相同的底层对象。处理对象是有用的在某些特殊情况下,一个对象代表一个物理对象窗口等情节,设备,或人,而不是像一个号码或矩阵的数学对象。

处理对象来自处理类,它提供了功能,如事件和监听器,析构函数方法,并支持动态属性。万博1manbetx

更多关于价值观和处理的信息,看到处理的比较和价值类类使用哪一种

另请参阅

相关的话题