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