我有这个代码(将图像读入一个巨大的矩阵)
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
在循环中增长。
那么这里最重要的是什么?
答案 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。