Matlab:在循环中生长的数组 - 那么什么?

时间:2013-07-02 11:53:27

标签: performance matlab memory-management

我有这个代码(将图像读入一个巨大的矩阵)

allImages = [];
for ii = 1 : n
    img = imread( fileNames{ii} );
    img = imresize( rgb2gray(img), [100 100] );
    allImages = cat(3, allImages, img ); % append image to huge matrix
end

Matlab指出我在循环中的最后一行警告我allIamges在循环中增长。

那么这里最重要的是什么?

1 个答案:

答案 0 :(得分:6)

这是一个大问题。

在正确性方面 - 代码完成了预期的工作。这里的问题是表现。

幕后会发生什么?

当新图像附加到allImages时,Matlab必须为调整大小的allImages找到连续内存区域(即一个块中的所有内容)。这通常需要为已调整大小的allImages分配新内存,复制旧数据并取消分配旧allImages。 在场景后面发生的这些重新分配+复制操作(可能在每次迭代!)可能非常耗时。


可以做些什么?

<强> 1。预分配:如果您知道图片数量和allImages的最终尺寸,请事先保留此空间:

allImages = zeros( 100, 100, n ); % pre-allocate, fill with zeros.
for ii = 1 : n
    % ...
    allImages(:,:, ii ) = img; % write into pre-allocated array
end

<强> 2。如果我事先不知道n怎么办?:已经有几个问题已经解决了这个问题。例如this answer