MATLAB内存变量的管理

1.在创建和修改数组时利用连续内存保存相关的变量

1. 为数组赋值:利用连续的内存分配。但是数组类型和维数作为数组的头信息保存在其他的地方。(两者没有存放在同一连续的内存区域)

2. 删除数组中的元素:先移除数组元素,后压缩原来分配给数组的内存空间。

3. 维数组增加元素:观察数组所在的连续区域中是否可以增加新元素。

· 如果可以容纳新增加的数组元素则仅需要扩大数组的分配内存,然后将新增加的数组元素添加到内存中。

· 如果原有数组存放的连续块不够大,则需要在Matlab内存中搜索新的能够同时容纳原有数组和新增数组元素的连续内存块。

如果能够找到足够连续的内存,则可以将原有数组元素拷贝到新分配的内存中,然后将新增加的数组元素添加新的内存中,然后释放原来的内存。(在此期间,内存中会有原数组数据的两份拷贝,增加了out of memory的风险)
如果没有搜索到连续的内存空间,则有可能产生out of memory的错误。

2.在进行数组拷贝时内存的分配

1. 函数形参实参化的时候,只有在当传递参数的数据内容发生变化的时候才会为参数分配内存。

2. 当一个数组赋值给另一个数组变量时,不会为新变量分配内存,而是仅仅将新变量的指针指向原变量,也就是说新变量仅是原来数组变量的引用(别名)。ps:如果新变量中元素值有改变时,Matlab就会为其新变量分配新的内存。

3.数组头

· whos函数只能用来查看变量所占用的存储空间,而不能显示数组头信息所占用的空间

由于数组头占据内存,并且其存储空间与数组数据并不连续。结构体和细胞数组不仅需要存储它们自己的数组头信息,还会为这些数组中的每个字段或每个细胞元素创建头信息,因此结构体和细胞数组消耗的内存与其创建方式有关。

4.不同数据结构的内存

1. 各类型占用空间:
有符号/无符号整型:
8-bit——1
16-bit——2
32-bit——3
64-bit——4

浮点数:
单精度——4
双精度——8

复数:
复数的实部和虚部在内存中是分开存放的,当在程序中修改复数的实部或虚部时,会在修改数据的同时复制复数的实部和虚部。

ps:在Matlab中,当数组的元素绝大部分为0时,Matlab一般默认采用稀疏矩阵进行存贮以节省空间。

5.Matlab内存计算方法

不同的系统数据的内存空间不同。
例如,
1. 细胞数组占用的内存空间的计算方法为:
(header_size x number_of_cells) + data
(对于64位系统,header_size为112。)

A = {1 2 3}——112×3+8×3
A = {[1 2 3]}——112×1+8×3
A = {{1 2 3}}——112×4+8×3

2. 64bit系统中结构体占用空间的计算方法:
fields x ((112 x array elements) + 64) + data
(32bit系统中将112改为60)

例子:已知一个结构数组A,查看其头信息。

>> A={[ ]}
>> whos A
  Name      Size            Bytes  Class    Attributes
  A         1x1               112  cell               
发布了19 篇原创文章 · 获赞 3 · 访问量 1421
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章