MATLAB如何分配内存

内存分配阵列

下面的主题提供了有关如何在MATLAB信息®与数组和变量工作时,软件分配的内存。其目的是在编写代码时,帮助您更有效地使用内存。大部分时间,但是,你应该不需要这些内部操作被关注的MATLAB自动为您处理数据的存储。

注意

如何在MATLAB软件处理数据的任何信息在内部是受在未来的版本的变化。

创建和修改阵列

当分配一个数字或字符数组变量,MATLAB分配一个连续的在块存储器,存储阵列的数据的虚拟块。MATLAB还存储阵列的数据,如它的类和尺寸的信息,在存储器被称为一个单独的,小块状

如果新元素添加到现有的阵列,在MATLAB中的现有阵列扩展在保持其存储保持连续的方式。这通常需要查找内存足够大的新的块来保存扩展阵列。MATLAB然后拷贝从其原始位置的数组的内容到该新块在存储器中,添加新的元素,以在该块阵列,并释放在存储器中的原始位置阵列。

如果从现有阵列删除元素,MATLAB通过移除删除的元素,然后在原始存储位置密实其存储保持存储器存储连续的。

与大型数据集。如果您正在使用大型数据集,你需要增加数组的大小时,避免受到造成内存不足的错误要小心。如果展开数组超出其原始位置的可用连续内存,MATLAB必须使阵列的副本,此副本设置为新的值。在这次行动中,有在内存中的原始数组的两个副本。这将暂时加倍的内存阵列所需的量,并增加执行过程中的内存耗尽你的程序的风险。最好是预先分配足够的存储空间在开始数组的最大潜在规模。看到预分配

阵列复制

在内部,多个变量可以指向相同的数据块,从而共享该数组的值。当一个变量复制到另一个变量(例如,B = A),MATLAB使得数组引用的一个副本,而不是数组本身。只要你不修改数组的内容,没有必要存储多于一个的复制。如果你修改数组的任何元素,MATLAB使得阵列复制了,然后修改副本。

本例使用记忆功能演示MATLAB如何处理复制阵列。记忆是仅适用于Windows®系统。

通过创建一个简单的脚本启动memUsed.m显示多少内存正在使用您的MATLAB程序。就把这两行代码的脚本。

[USR,SYS] =存储器;usr.MemUsedMATLAB

获取的多少内存正在使用您的MATLAB过程中的初始读数:

格式化短主机;memUsed ANS = 295.4977e + 006

创建2000-通过-2000数字阵列A.这大约32MB的内存使用:

A =魔法(2000);memUsed ANS = 327.6349e + 006

让数组的副本一个。至于有没有必要在阵列数据的两个副本,MATLAB不仅使数组引用的一个副本。这不需要显著额外的内存:

B = A;memUsed ANS = 327.6349e + 006

现在修改通过使一个半其原始大小(即,设置1000行为空)。这就要求MATLAB使至少前1000个记录的副本一个阵列,以及分配该复制到

B(1001:2000,:) = [];格式化短;尺寸(B)ANS = 1000 2000

再次检查所使用的内存。即使比它最初显著越小,存储器由MATLAB过程中使用的量大约16 MB(原本所需的32 MB的1/2增加一个),因为不能再继续作为只是一个参考一个

格式化短主机;memUsed ANS = 343.6421e + 006

阵头

当分配一个数组变量,对阵列中的单独的一块内存MATLAB还存储信息(如类和尺寸)被称为标题。对于大多数阵列,所需要的存储器,用于存储首部是微不足道的。有一个小的优势,在一个小数目,而不是大量的小阵列的大阵列的存储大量的数据集。这是因为前者的配置需要更少的阵列头。

结构和细胞阵列。对于结构和单元阵列,MATLAB不仅对于每个阵列,也用于该结构的每个字段和用于单元阵列的每个单元产生的标题。正因为如此,存储器的量要求存储的结构或单元阵列不仅取决于多少数据保持,但也它是如何构成的。

例如,拿一个标量结构阵列S1有田[RG。大小100逐50的每个字段需要一个阵列头,以描述整体结构,对于每个唯一的字段名称的一个首部,和每一个字段标头为1×1的结构阵列。这使得总共七个阵列标头的整个数据结构:

S1.R(1:100,1:50)S1.G(1:100,1:50)S1.B(1:100,1:50)

在另一方面,取100通过-50结构阵列S2其中每个元件具有标量场[RG。在这种情况下,就需要一个阵列头,以描述每场的整体结构,一个用于每个唯一字段名,和一个用于每个所述结构的5000个元素,即总共15004个阵列标头的整个数据结构:

S2(1:100,1:50).R S2(1:100,1:50).G S2(1:100,1:50).B

即使S1S2包含相同的数据量,S1使用存储器显著更小的空间。不仅是较少的存储器需要,但是有一个相应的速度的好处是用所述S1格式,以及。

请参阅“电池阵列”和“结构”数据结构和内存

内存使用情况报告的卫生组织的功能。谁是功能显示的内存量消耗的任何变量。为了简单起见,谁是报告只有内存用于存储的实际数据。它不为数组头报告存储,例如。

函数参数

MATLAB处理函数调用以类似的方式传递的参数。当你传递一个变量的函数,实际上传递给数据的引用,所述变量代表。只要输入数据没有被修改的函数被调用,在调用函数中的变量和在所调用的函数指向存储器中的相同的位置的变量。如果输入数据的被调用函数修改的值,然后MATLAB使得原来阵列的在新的位置中的存储器中被调用的函数的副本,与所述修改的值复制的更新,和点输入变量到这个新的阵列。

在下面的例子中,功能myfun修改数组的值传递给它。MATLAB使得在所述阵列的存储器的副本所指向的一个,将变量X作为这种新的数组的引用,然后设置的一排X零。通过引用的数组一个保持不变:

A =魔法(500);myfun(A);函数myfun(X)X(400,:) = 0;

如果调用函数需要数组的修正值也传递给myfun,你需要更新的阵列作为返回被调用函数的输出,如下所示的变量一个

A =魔法(500);A = myfun(A);的sprintf( 'A的新值是%d',A)函数Y = myfun(X)X(400,:) = 0;Y = X;

数据结构和内存

内存要求的各类MATLAB的数据结构的不同。你也许可以考虑MATLAB如何将它们存储,以减少内存使用这些结构的量。

数字数组

MATLAB要求1,2,4或8个字节来存储8位,16位,32位和64位有符号和无符号整数,分别。为浮点数,MATLAB用来4个或8字节类型。为了节省内存与数字数组,MathWorks公司工作时®建议您使用包含您的数据也不会溢出的最小整数或浮点数类型。欲了解更多信息,请参阅数值类型

复杂的阵列

MATLAB存储复杂的数据作为单独的实部和虚部。如果你犯了一个复杂的数组变量的副本,然后只修改阵列的实或虚部,MATLAB创建一个包含两个实部和虚部的数组。

稀疏矩阵

这是最好的存储矩阵与在稀疏的格式大多是零值。稀疏矩阵可以使用较少的内存,并且还可能会快于全矩阵操作。您可以使用一个完整的矩阵转换为稀疏格式功能。

比较两个1000-通过-1000矩阵:X以其元素的2/3双打的矩阵等于零;和ÿ,的稀疏副本X。下面的示例示出了稀疏矩阵需要大约一半的存储器:

卫生组织名称大小字节级X 1000×1000 8000000双列Y 1000×1000 4004000双阵列(稀疏)

电池阵列

除了数据存储,单元阵列需要一定量的额外存储器来描述每个单元存储的信息。此信息被记录在,并且对于所述阵列的每个单元一个报头。可以通过找到由不包含任何数据,如下面的用于32位系统中的1乘1细胞所消耗的字节数确定的一个单元阵列头所需的存储器的量:

A = {[]};%空单元阵列卫生组织甲名称大小字节类属性的1x1的60细胞

在这种情况下,MATLAB示出为60。这是在所有的本节中的32位实施例中使用的标头的大小所需的32位系统中的单元阵列中每个报头的字节数。对于64位的系统中,报头大小被假定为这个文档中112个字节。你可以找到使用只示出了用于32个比特的方法的64位系统上正确的标头的大小。

来预测整个单元阵列,乘以已导出由所述阵列中的单元的总数量的报头数的大小,然后添加到用于数据所需要的字节数打算将阵列中存储:

(header_size X number_of_cells)+数据

所以,它包含400个字节的数据的一个10×20单元阵列将需要一个64位的系统上22800个字节的内存:

(112×200)+ 400 = 22800

注意

虽然数字阵列必须被存储在连续的存储器,结构和单元阵列没有。

实施例1 - 内存分配的单元阵列。下面的4×1单元阵列记录了品牌名称,屏幕尺寸,价格,以及销售三个笔记本电脑的地位:

笔记本电脑= {[ 'SuperrrFast 89X', 'ReliablePlus G5',... 'UCanA4dIt 140L6'];... [单(17),单(15.4),单(14.1)];... [2499.99,1199.99,499.99];... [真,真,假]};

在32位的系统中,单元阵列头单独需要每个细胞60个字节:

4个细胞*每小区60个字节= 240个字节的单元阵列

计算包含在四个单元的数据所需的存储器:

45个字符*每个字符2个字节= 90个字节的3个双*每双= 24 8个字节字节3个单打*每单次= 12的4个字节字节3个逻辑值*每个逻辑= 3字节90 + 24 + 12 + 3 = 129个字节1个字节对于数据

添加了两下,然后你的结果与MATLAB返回的大小对比:

240 + 129 = 369字节总计:卫生组织笔记本名称大小字节类属性笔记本4X1 369细胞

结构

S.A = [];B =卫生组织( 'S');B.bytes  -  60 ANS = 64

计算所需的结构阵列的存储器如下:

32位系统:字段×((60×数组元素)+ 64)+数据64位系统:字段×((112 X数组元素)+ 64)+数据

在64位计算机系统中,一个4×5结构的客户端同场地址电话只使用了结构4,608字节:

2个字段×((112×20)+ 64)= 2×(2240 + 64)= 4608个字节

为了那笔,你必须添加保存分配给每个字段的数据所需的内存。如果分配25个字符的载体地址和一个12字符向量电话在的每个元件的4×5客户端数组,可以使用1480个字节的数据:

(25 + 12)*字符每字符* 20个元素= 1480个字节2个字节

添加两个,你看,整个结构耗费6,088字节的内存。

实施例1 - 内存分配为一个结构数组。计算该将被要求存储具有32位的系统上使用以下四个字段以下6×5结构的阵列的存储器的量:

A:5-×8×6符号的8位整数数组B:1-由-500单一阵列C:30通过-30无符号的16位整数数组d:1 * 27字符数组

构建阵列:

A = INT8(个(5,8,6));B =单一(1:500);C = UINT16(魔(30));d ='公司名称:MathWorks的;S =结构( 'F1',A, 'F2',B, 'F3',C, 'F4',d);对于m = 1:对于n = 1 6:5秒(M,N)= S(1,1);年底结束

计算的存储器的结构本身所需的量,然后对包含的数据:

结构=字段×((60×数组元素)+ 64)= 4×((60×30)+ 64)= 7456个字节的数据=(FIELD1 + FIELD2 +字段3 + field4中)X数组元素=(240 + 2000 + 1800+ 54)×30 = 122820个字节

添加了两下,然后你的结果与MATLAB返回的大小对比:

总字节数计算结构S:7456 + 122820 = 130276卫生组织命名SIZE字节类属性小号引脚6x5 130036结构