为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

变量似乎在每次循环迭代时改变大小 - 什么?在编写以下Matlab代码时:for ii=1:n     x(ii) = foo( ii ); % foo is some function of ii that cannot be vectorized.end我得到以下m-lint警告:变量x似乎在每次循环迭代时改变大小我的问题:这个警告意味着什么?为什么每次迭代都会改变变量大小是件坏事?怎样才能解决这个问题?这个问题是不能重复的这一个,因为它与预分配的更一般的问题,而是它的一个特定实例涉及。
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

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

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

警告说明

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

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

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

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

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

自动阵列增长优化

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

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

预分配

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


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 1448 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信