Performance Matlab:数组在循环中增长-那又怎样?

Performance Matlab:数组在循环中增长-那又怎样?,performance,matlab,memory-management,Performance,Matlab,Memory Management,我有这个代码(将图像读入一个巨大的矩阵) Matlab将我指向循环中的最后一行,警告我allIamges在循环中增长 这有什么大不了的 这是一件大事 就正确性而言,代码做了预期的事情。这里的问题是性能 幕后发生了什么? 当一个新的图像被附加到所有图像,Matlab必须为调整大小的所有图像找到一个连续的内存区域(即全部在一个块中)。这通常需要为调整大小的所有图像分配新的内存,复制旧数据并取消分配旧所有图像 这些在幕后发生的重新分配+复制操作(可能在每次迭代中!)可能非常耗时 可以做些什么? 1。

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

Matlab将我指向循环中的最后一行,警告我
allIamges
在循环中增长

这有什么大不了的

这是一件大事

就正确性而言,代码做了预期的事情。这里的问题是性能

幕后发生了什么? 当一个新的图像被附加到
所有图像
,Matlab必须为调整大小的
所有图像
找到一个连续的内存区域(即全部在一个块中)。这通常需要为调整大小的
所有图像
分配新的内存,复制旧数据并取消分配旧
所有图像

这些在幕后发生的重新分配+复制操作(可能在每次迭代中!)可能非常耗时


可以做些什么? 1。预分配:如果您知道图像的数量和所有图像的最终大小,请事先保留此空间:

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

2。如果我事先不知道怎么办?:有几个问题已经在处理这个问题了。例如。

+1,但是,这是非常重要的。@RodyOldenhuis-谢谢,我不知道…@RodyOldenhuis这会让我发疯的…woodchips也写了一篇关于这个主题的好文章:@EitanT错过了这一点。我只是标记了我的答案,要求它移到那个问题上。谢谢你发现了复制品。
allImages = zeros( 100, 100, n ); % pre-allocate, fill with zeros.
for ii = 1 : n
    % ...
    allImages(:,:, ii ) = img; % write into pre-allocated array
end