函数和变量的内存管理
在MATLAB中,对于内存消耗,人们有不同的看法。有时人们不知道细节。今天我将讨论MATLAB如何复制数据,包括调用函数和存储在变量中的数据。MATLAB只在引用的数据发生变化时才复制传递的数组(这称为写时复制或延迟复制)。
内容
将数组传递给函数
问题是,当MATLAB将数组传递给函数时,什么时候会复制内存。一些用户认为,因为MATLAB的行为就像数据是按值传递的(而不是按引用传递的),所以MATLAB在调用函数时总是会复制输入。这并不一定是真的。看一下这个函数。
类型fred1
函数y = foo(x,a,b) a(1) = a(1) + 12;Y = a * x + b;
在fred1,第一和第三输入,x而且b,内部没有改变。MATLAB识别了这一点,并将这两个变量都传递进来,而不进行任何额外的复制。这可以大大节省内存,例如,如果x是一个大型数据集。然而,在fred1,我们可以看到第二个输入,一个,在内部被修改。MATLAB可以识别变量何时发生这种情况,并对其进行复制,以便不修改调用工作区中的原始变量。
结构与记忆
在MATLAB中,每个结构成员都被视为一个单独的数组。这意味着如果修改结构的一个成员,则不会复制其他未更改的成员。是时候做个说明了。
创建一些rgb图像数据与3个平面:红,绿,蓝。
im1.r= rand(300,300); im1.g = rand(300,300); im1.b = rand(300,300);
相反,重新排列相同的数据,使我们有一个结构数组,每个元素包含一个[r g b]三联体。
im2(300300)。rgb = [0 0 0];%预分配数组为R = 1:300为C = 1:300 im2(r, C)。rgb = [im1.r(r,c) im1.g(r,c) im1.b(r,c)];结束结束
让我们来比较一下im1而且im2.
清晰的cr整理工作空间谁
名称大小Bytes Class im1 1x1 2160372 struct array im2 300x300 7560064 struct array s 1x1 392 struct array sNew 1x1 392 struct array总元素为630043,使用9721220字节
im1是一个标量结构,其成员包含m x n个数组。
- im1.r= imageRedPlane——大小为m x n
- im1.g= imageGreenPlane——大小为m x n
- im1.b= imageBluePlane——大小为m x n
im1大小为1 x 1;里面的数组总数im1: 3
im2是一个m x n结构数组,其中字段包含3个元素向量。
- im2 .rgb (i, j)= imageOneRGBPixel—大小为1 x 3
im2大小为m x n;里面的数组总数im2: m x n
注意:每个MATLAB数组分配一个带有信息的头。这使得im1内存效率更高im2(通常,包含数组的标量结构比结构数组更节省内存)。当结构中的一个字段被更改,并且可能被复制时,其他字段保持不变。
s.A = rand(3);s.B =魔术(3);sNew = s;sNew.A(3) = 14;
自年代而且sNew有没有未经修改的副本B,B字段共享内存,但是一个字段则不然。请参阅文档部分高效使用内存获取更多信息。
您对MATLAB内存管理的心理模型是什么?
快说三遍!
这里和/或文档中的描述是否改变了您的模型?
让我知道。
使用MATLAB®7.2发布
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。