Ben*_*sen 7 arrays matlab memory-management pre-allocation
我使用一个简单的for循环来裁剪大量图像,然后将它们存储在单元格数组中.我一直收到消息:
变量
croppedSag似乎在每次循环迭代时改变大小.考虑预先分配速度.
我在MATLAB编写代码之前已经多次看过这个.我总是忽略它,并且好奇有多少预先分配将增加运行时间,如果我有10,000个图像或更大的数字?
另外,我已阅读有关在文档中预分配的内容,并说它zeros()可用于此目的.我如何将其用于下面的代码?
croppedSag = {};
for i = 1:sagNum
croppedSag{end+1} = imcrop(SagArray{i},rect);
end
Run Code Online (Sandbox Code Playgroud)
我没有完全按照文档中的示例进行操作.
nib*_*bot 12
在Matlab中预先分配数组总是一个好主意.另一种方法是使一个数组在每次迭代期间通过循环生长.每次将一个元素添加到数组的末尾时,Matlab必须生成一个全新的数组,将旧数组的内容复制到新数组中,最后在最后添加新元素.预分配消除了分配新阵列的需要,并花费时间将阵列的现有内容复制到新内存中.
但是,在您的情况下,您可能看不到您所期望的那么多好处.当将单元阵列复制到新的放大单元阵列时,Matlab实际上不必复制单元阵列的内容(图像数据),而只是指向该数据的指针.
尽管如此,没有理由不预先分配(除非你事先不知道最终的大小).这是你的循环的预分配版本:
croppedSag = cell(1, sagNum);
for ii = 1:sagNum
croppedSag{ii} = imcrop(SagArray{ii}, rect);
end
Run Code Online (Sandbox Code Playgroud)
我还将索引变量"i"更改为"ii",以便它不会覆盖虚构单元.
您还可以使用cellfun函数在一行中重写此循环:
croppedSag = cellfun(@(im) imcrop(im, rect), SagArray);
Run Code Online (Sandbox Code Playgroud)
这是一篇可能提供信息的博客文章: