主要内容

MATLAB如何分配内存

内存分配的数组

这个话题提供了MATLAB的信息®当使用数组和变量分配内存。目的是帮助您更有效地使用内存时写代码。在大多数情况下,然而,你不需要关心这些内部操作MATLAB为您自动处理数据存储。

请注意

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

创建和修改数组

当你分配一个数字或字符数组变量,MATLAB分配一个连续的虚拟块的内存和存储阵列数据块。MATLAB还存储阵列数据的信息,如它的类和维度,在一个单独的、小的内存块,称为

如果你新元素添加到一个现有的数组,MATLAB扩展现有的数组在内存的方式使其存储连续的。这通常需要找到一个新的内存块足够容纳扩大数组。MATLAB然后复制数组的内容从其原始位置复制到这个新块在内存中,将新元素添加到阵列在这个块,并释放原始数组在内存中的位置。

如果你删除元素从现有的数组,MATLAB保持记忆存储连续通过删除被删除的元素,然后压实其存储在原来的内存位置。

处理大型数据集。如果你是处理大型数据集时,您需要小心当增加一个数组的大小来避免错误造成的内存不足。如果你扩展数组超出了其原始位置的可用连续的内存,MATLAB必须使数组的副本,这个副本的新值。在这个操作过程中,有两个副本的原始数组在内存中。这暂时双打所需的内存数组和增加的风险,您的程序在执行期间的内存耗尽。最好是preallocate足够内存数组的最大潜在规模。看到预先配置

复制数组

在内部,多个变量可以指向同一块数据,因此共享数组的值。当您将一个变量复制到另一个变量(例如,B =一个),MATLAB复制数组的引用,而不是数组本身。只要你不要修改数组的内容,不需要存储多个副本。如果你修改任何元素的数组,数组的MATLAB复制然后修改副本。

下面的例子使用了内存函数说明MATLAB处理复制数组。内存只能在Windows上吗®系统。

首先创建一个简单的脚本memUsed.m显示有多少内存被你的MATLAB程序。把这两行代码的脚本。

[usr、sys] =记忆;usr.MemUsedMATLAB

得到一个初始阅读多少内存被你的MATLAB程序:

格式短eng;memUsed ans = 295.4977 e + 006

创建一个2000 - a - 2000数字阵列使用大约32 mb的内存:

一个=魔法(2000);memUsed ans = 327.6349 e + 006

复制数组一个B。是不需要有两个数组数据的副本,MATLAB只复制数组的引用。这就要求没有显著增加内存:

B =一个;memUsed ans = 327.6349 e + 006

现在修改B通过一个原始大小的一半(即1000行设置为空)。这就要求MATLAB复制至少第一1000行一个复制数组,并分配B:

:B (1001:2000) = [];格式短;大小(B) ans = 1000 2000

再次检查内存使用量。尽管B明显比原来的小,MATLAB进程所使用的内存的数量增加了约16 MB (1/2 32 MB的最初要求一个),因为B再也无法保持只是一个参考吗一个:

格式短eng;memUsed ans = 343.6421 e + 006

数组头

当你将一个数组分配给一个变量,MATLAB还存储数组的信息(如类和维度)在一个单独的块内存头。对于大多数数组,存储所需的内存头是无关紧要的。存储大型数据集有一个小的优势在少数大型数组而不是大量小数组。这是因为前者配置需要更少的数组头。

细胞结构和数组。结构和细胞阵列,MATLAB为每个数组创建一个标题不仅,而且对每个字段的每个细胞的细胞结构和数组。正因为如此,所需的内存来存储结构或单元阵列不仅取决于其所拥有的数据,但它是如何构建的。

例如,以一个标量结构数组S1在字段R,G,B。每个字段的大小100 - - 50头需要一个数组来描述总体结构,每个独特的字段名,一个头和一头字段1×1结构数组。这使得共有七个数组头整个数据结构:

S1.R (1:10 0, 1:50) S1.G (1:10 0, 1:50) S1.B (1:10 0, 1:50)

另一方面,100 - 50结构数组S2每个元素都有标量场R,G,B。在这种情况下,您需要一个数组头描述总体结构,每个独特的字段名,和每个领域一个5000个元素的结构,使得整个一系列共有15004头数据结构:

S2 (1:10 0, 1:50)。RS2 (1:10 0, 1:50)。GS2 (1:10 0, 1:50)。B

尽管S1S2包含相同数量的数据,S1在内存中使用显著更少的空间。不仅需要更少的内存,但有一个好处使用相应的速度S1格式。

看到“细胞数组”和“结构”数据结构和记忆

内存使用谁报告的功能。函数显示消耗的内存的任何变量。为了简单起见,只报告内存用来存储实际数据。它不报告存储数组头,例如。

函数参数

MATLAB处理参数传入函数调用以类似的方式。一个变量传递给一个函数时,你实际上是通过引用变量表示的数据。只要输入数据没有修改函数被调用时,调用函数中的变量和变量在被调用的函数在内存中相同的位置。如果被调用的函数修改的值输入数据,然后用MATLAB复制的原始数组在内存中一个新的位置,复制和修改后的值更新,点的输入变量在被调用的函数这一新的数组。

在下面的例子中,函数myfun修改数组传递到它的价值。MATLAB复制数组在内存中指出一个,设置变量X作为一个新数组的引用,然后设置一行X为零。数组的引用一个保持不变:

一个=魔法(500);myfun(一个);函数myfun (X) X(400年:)= 0;

如果调用的函数需要修改后的值的数组传递给myfun,您需要返回更新后的数组作为输出的被调用的函数,如下所示为变量一个:

一个=魔法(500);一个= myfun (A);sprintf (% 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创建一个数组,其中包含两个实部和虚部。有关更多信息,请参见MATLAB支金宝app持墨西哥人交错复杂的API函数

稀疏矩阵

最好是存储矩阵稀疏格式的值,大多是零。稀疏矩阵可以使用更少的内存,也可以更快比完整的矩阵操作。你可以把一个完整的矩阵稀疏格式使用稀疏的函数。

比较两个1000 - 1000年——矩阵:X双打的2/3的矩阵元素等于零;和Y稀疏的副本X。下面的例子显示了稀疏矩阵需要大约一半的记忆:

谁的名字大小字节类X 1000 x1000 8000000双阵列Y 1000 x1000 8000000双阵列(稀疏)

细胞数组

除了数据存储、细胞阵列描述每个单元需要额外的内存来存储信息。这个信息被记录在一个,有一个标题为数组的每一个细胞。您可以确定所需的内存单元阵列头通过消耗的字节数1×1电池不包含数据,对64位系统如下所示:

C = {[]};%空单元阵列谁C类属性名称大小字节C 1 x1 104细胞

预测整个单元阵列的大小,标题的大小乘以总数细胞数组,然后添加到所需的字节数的数据你打算存储数组:

(header_size x number_of_cells) +数据

例如,一个10到20单元阵列,其中包含400字节的内存需要21200字节的数据在64位系统:

(104 x 200) + 400 = 21200

请注意

数字数组必须存储在相邻的内存时,细胞结构和数组。

例子——内存分配单元阵列。这个4-by-1细胞数组记录品牌,屏幕大小,价格,和代销的状态有三个笔记本电脑:

笔记本电脑= {[‘SuperrrFast 89 x’,‘ReliablePlus G5’,……“哈佛UCanA4dIt 140”);…(单(17),单(15.4),单(14.1)];…(2499.99,1199.99,499.99);…(真的,真的,假的)};

在64位系统上,单元阵列头仅需要104字节/细胞:

4细胞* 104字节/细胞= 416字节单元阵列

计算所需的内存中的数据包含的四个细胞:

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

添加这两个,然后比较结果与MATLAB返回的大小:

416 + 129 = 545字节谁笔记本电脑名称大小字节总数类属性笔记本电脑4 x1 545细胞

结构

在64位系统上,一个结构数组的每一个领域都要求一个104字节的头。此外,每一个独特的字段名需要64字节的头。例如,一个结构和一个空字段消耗168字节(104字节的字段和64字节的字段名):

年代。一个= []; whos S Name Size Bytes Class Attributes S 1x1 168 struct

预测整个结构数组的大小,计算报头字节的总数,然后添加到所需的字节数的数据你打算存储数组:

number_of_fields x (x (number_of_array_elements field_header_size) + fieldname_header_size) +数据

例如,一个4 * 5的结构客户与字段地址电话使用4288字节的头:

2 x ((20 x 104) + 64) = 4288字节

金额,您必须添加所需的内存分配给每个字段的数据。如果你分配一个25-character向量地址和一个长度向量电话4 * 5的每个元素客户数组,你需要1480字节的数据:

(25 + 12)字符* 2字节/元素char * 20 = 1480字节

添加两个和你看到整个结构消耗5768字节的内存。

例子——结构数组的内存分配。计算所需的记忆在64位系统上存储6-by-5结构数组与这些字段值:

5-by-8-by-6签署了8位整数数组B: 1 - C - 500单阵列:30-by-30 16位无符号整数数组D: 1-by-23字符数组

构建数组:

一个= int8 ((5、8、6));B =单(1:50 0);C = uint16(魔法(30));D =“公司名称:MathWorks”;S =结构(的f1, f2, B, f3, C, f4, D);对m = 1:6 n = 1:5 (m, n) =年代(1,1);结束结束

计算所需的内存结构本身,然后为它所包含的数据:

结构=字段x((数组元素x 104) + 64) = 4 x ((30 x 104) + 64) = 12736字节数据= (field1 + field2 + field3 + field4) x数组元素= (240 + 2000 + 1800 + 46)x 30 = 122580字节

添加这两个,然后比较结果与MATLAB返回的大小:

总字节计算结构年代:12736 + 122580 = 135316谁类属性名称大小字节年代6 x5 135316结构