数组的内存预分配

1.给数组预分配内存

可以通过给保存输出结果的数组预分配内存空间来改善代码的运行效率。预分配使得不必在每次数组变大时进行改变。针对不同类型的数组使用合适的预分配函数如表1-2所示。

表1-2 针对不同类型的数组使用预分配函数

数 组 类 型 预分配函数 示 例
数值数组 zeros y = zeros(1,100);
单元数组 cell B = cell(2,3); B{1,3} = 1:3; B{2,2} = 'string';
结构数组 struct repmat data = repmat(struct('x',[1 3],... 'y',[5 6]), 1, 3);

使用大型矩阵时,预分配还可以帮助减少内存碎片。MATLAB中,进行动态的内存分配和取消分配时,内存可能会成为碎片。这将导致大量闲置内存的产生。预分配则可以通过在计算以前给大型数据结构“预约”足够的空间来避免这个问题。

2.给非double型矩阵预分配内存

给double型以外的矩阵预分配一个内存块时,使用repmat函数的效果更佳,此时可以取得更好的效率和更快的运行速度。

下面的语句用zeros函数预分配一个uint8型100×100的矩阵。首先,创建一个double型满秩矩阵,然后把矩阵转换为uint8型,这将导致不必要的时间和内存花费。

code.matlab
A = int8(zeros(100));

使用repmat函数,只需要创建一个double值,从而减少了对内存的需求。

code.matlab
A = repmat(int8(0), 100, 100);

在不能进行预分配的时候,看是否能通过repmat函数使数组变大,用repmat函数扩展矩阵时,可以获得连续的内存块。

3.给图形对象数组预分配内存

使用gobjects函数给图形对象数组预分配内存。数组中的每个元素都可以是图形对象句柄。下面给一个4*1的数组预分配内存。

code.matlab
h=gobjects(4,1);

给数组元素制定坐标轴句柄。

code.matlab
for k=1:4
  h(k)=subplot(2,2,k);
end

gobjects函数返回一个GraphicsPlaceholder数组。可以用任何类型的图形对象替换占位符元素。