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