7

我正在使用一个简单的for循环来裁剪大量图像,然后将它们存储在一个单元格数组中。我不断收到消息:

该变量croppedSag似乎在每次循环迭代时都会改变大小。考虑预分配速度。

我之前在 MATLAB 中编码时已经多次看到这一点。我一直忽略它,我很好奇如果我有 10,000 张或更多图像,预分配会增加多少运行时间?

另外,我在文档中阅读了有关预分配的信息,它说要用于此zeros()目的。我将如何将它用于下面的代码?

croppedSag = {};
for i = 1:sagNum
    croppedSag{end+1} = imcrop(SagArray{i},rect);
end

我没有完全按照文档中的示例进行操作。

4

1 回答 1

12

在 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);

这是一个可能提供信息的博客条目:

于 2011-06-02T16:13:22.560 回答