Matlab:在循环内增长的数组 - 那又怎样? [复制]
Posted
技术标签:
【中文标题】Matlab:在循环内增长的数组 - 那又怎样? [复制]【英文标题】:Matlab: Array growing inside a loop - so what? [duplicate] 【发布时间】:2013-06-29 18:45:05 【问题描述】:我有这段代码(将图像读入一个巨大的矩阵)
allImages = [];
for ii = 1 : n
img = imread( fileNamesii );
img = imresize( rgb2gray(img), [100 100] );
allImages = cat(3, allImages, img ); % append image to huge matrix
end
Matlab 将我指向循环中的最后一行,警告我 allIamges
在循环内增长。
那么这里有什么大不了的?
【问题讨论】:
@EitanT 错过了这一点。我只是标记了我的答案,要求将其移至该问题。感谢您发现重复项。 【参考方案1】:这是一件大事。
就正确性而言 - 代码符合预期。这里的问题是性能。
幕后发生了什么?
当一个新图像附加到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。
【讨论】:
+1,但是,R2011a has improved the situation 相当多。 @RodyOldenhuis - 谢谢,不知道... @RodyOldenhuis 这会让我发疯的...... woodchips 也写了一篇关于这个主题的好文章:***.com/a/783137/97160以上是关于Matlab:在循环内增长的数组 - 那又怎样? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Python相当于在Matlab中分配给一个数组(在for循环内)