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
尽管S1
和S2
包含相同数量的数据,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结构