【问题标题】:Preallocating arrays in Matlab?Matlab中的预分配数组?
【发布时间】:2011-09-07 04:53:15
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: arrays matlab memory-management pre-allocation


【解决方案1】:

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

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

【讨论】:

  • 您需要将'UniformOutput' 设置为false,如下所示:croppedSag = cellfun(@(im) imcrop(im, rect), SagArray,'UniformOutput',false);
  • 另一个有用的链接:blogs.mathworks.com/steve/2011/05/20/…
猜你喜欢
  • 2013-08-19
  • 1970-01-01
  • 2013-07-25
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多