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循环内)

matlab怎样合并元胞数组

Matlab:迭代循环

怎样用matlab计算一个矩阵和大量矩阵分别相乘

在MATLAB编程时,想要把循环中的某个变量保存下来怎么办?

在MATLAB编程时,想要把循环中的某个变量保存下来怎么办?