罗兰谈MATLAB的艺术

将想法转化为MATLAB

函数和变量的内存管理

在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:300C = 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帐户或创建一个新帐户。