【问题标题】:Matlab: Array growing inside a loop - so what? [duplicate]Matlab:在循环内增长的数组 - 那又怎样? [复制]
【发布时间】:2013-06-29 18:45:05
【问题描述】:

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

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 在循环内增长。

那么这里有什么大不了的?

【问题讨论】:

  • @EitanT 错过了这一点。我只是标记了我的答案,要求将其移至该问题。感谢您发现重复项。

标签: performance matlab memory-management


【解决方案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

【讨论】:

猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2017-06-19
相关资源
最近更新 更多