相关文章推荐

变量似乎在每次循环迭代时改变大小 - 什么?

在编写以下Matlab代码时:

for ii=1:n
    x(ii) = foo( ii ); % foo is some function of ii that cannot be vectorized.end

我得到以下 m-lint 警告:

变量 x 似乎在每次循环迭代时改变大小

我的问题:

  1. 这个警告意味着什么?

  2. 为什么每次迭代都会改变变量大小是件坏事?

  3. 怎样才能解决这个问题?


这个问题是不能重复的 这一个 ,因为它与预分配的更一般的问题,而是它的一个特定实例涉及。


查看完整描述

我的回答有点迟了,但我在MATLAB中提到了有关数组增长和预分配的一些内容。

首先要注意的是,MATLAB在最近的版本中已经大大提高了自动阵列增长性能,因此 如果 你做得正确,警告所暗示的性能可能不会太差(见下文)。不过,最佳做法是预先分配您的数组(例如 zeros )。

警告说明

自R2014a起,警告的详细说明如下:

指示的变量或数组的大小似乎随着每次循环迭代而改变。通常,出现此消息是因为数组通过赋值或连接而增长。通过分配或连接来增长阵列可能很昂贵。对于大型数组, MATLAB必须分配一个新的内存块,并在进行 每次赋值时 将较旧的数组内容复制到新数组 中。

以这种方式改变变量大小的程序可以将大部分运行时间花在这种低效的活动上。...

从这个摘录中可以清楚地看出,如果你完全关注性能,预分配是一个聪明的想法。

旁注:关于在阵列增长期间用于重新分配的算法的信息有限,但是一些信息是由Steve Eddins在同一篇博客文章中提供的,我在 前面的答案 对此进行了 总结。

自动阵列增长优化

如果要通过沿维度增长(不预分配)来使用动态数组大小调整,则可以采用正确的方法。请参阅 Steve Eddins撰写的MathWorks博客文章 。最重要的是要注意你应该 沿着最后一个维度增长以获得最佳性能 。在您的情况下这不是问题,因为数组是1D。因此,如果您决定让它骑行,请 %#ok<SAGROW> 在罪魁祸首代码之后与警告放在同一行,以使警告静音。

Yair 在他博客的另一篇文章中 讨论了动态数组调整大小。此外,有一些方法可以在不使用一些毛茸茸的MEX API杂技进行初始化的情况下分配数组,但就是这样。

预分配

建议进行预分配。养成习惯,学会爱 zeros 。如果你决心从MATLAB中挤出一点性能,Yair Altman就内存预分配这个主题提出了几篇很好的文章:


查看完整回答

TA贡献1715条经验 获得超14个赞

关于这个问题有很多材料。以下是一些选定的链接以获取更多信息:

官方文档和技术解决方案:

MathWorks博客:

社区博客:

相关Stack Overflow问题/答案:


查看完整回答
 
推荐文章