gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:55 38 4
gpt4 key购买 nike

编写如下Matlab代码时:

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

我得到以下 m-lint警告:

The variable x appears to change size on every loop iteration

我的问题:

  1. 这个警告是什么意思?
  2. 为什么每次迭代都更改变量大小是一件坏事?
  3. 如何解决这个问题?

这个问题不是this one的重复问题,因为它处理预分配的更一般方面,而不是它的特定实例。

最佳答案

好吧,首先是第一件事。

1。这个警告是什么意思?

此代码在语法方面是正确的,它将正确执行并返回预期结果:x 的第 ii 元素将包含值 foo (二).
然而,在这段小代码运行之前,变量x并没有被定义。现在,当循环开始时,x(1) 被赋予值 foo( 1 ),所以 Matlab 创建 x 作为长度 - 1 个阵列。在第二次迭代时,x(2) 被赋值为 foo( 2 ),因此 Matlab 需要将 x 的长度更改为 2,依此类推:x 在每次迭代时更改其长度/大小。

2。为什么每次迭代都更改变量大小是一件坏事?

考虑当 x 每次迭代更改其大小时在后台发生的情况(在内存分配方面):在每次迭代中,Matlab 需要找到一个空闲内存空间来承载新大小的 x。如果幸运的话,x 之后有足够的可用空间,所以所发生的只是更改分配给 x 的内存量,并在右侧写入新值现货。
但是,如果在 x 之后没有足够的可用空间,Matlab 必须为 all ii-1 中已经存在的元素寻找一个新位置x,为x分配这个新空间,复制x<中已有的所有ii-1 到新点,并释放旧点 x 使用。这种在后台发生的无分配副本操作可能非常耗时,尤其是当 x 很大时。

3。如何解决这个问题?

最简单的解决方案是在循环之前预先分配x所需的所有空间:

x = zeros(1,n); 
for ii=1:n
x( ii ) = foo( ii );
end

通过预分配,我们确定 x 预先分配了它需要的所有内存,因此在执行循环时不需要昂贵的内存分配/复制。

另一种很酷的问题解决方案

如果你太懒了(像我一样)并且不想预分配你可以简单地:

for ii=n:-1:1
x( ii ) = foo( ii );
end

这样,第一次为 x 赋值时,它被赋给它的第 n 个元素(最后一个),因此 Matlab 立即x 的所有 n 元素分配空间。
酷!

关于matlab - 变量似乎在每次循环迭代时都会改变大小 - 什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21023171/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com