Matlab使用什么算法来动态调整向量和矩阵的大小?

4
运行此代码:
n = 5;
x = zeros(n, 1);
for ix=1:10
   x(ix) = rand();
   disp(getfield(whos('x'), 'bytes'))
end

输出这个:

40
40
40
40
40
48
56
64
72
80

这似乎表明当Matlab调整向量大小时,它会将其调整为恰好需要的空间,没有多余的空间。因此,一次只能调整一个元素。
与Sun的Java ArrayList实现中方法相比,后者分配足够的空间,以便每次重新分配不需要在初始绑定之上进行。显然,由于Matlab不是开源的,所以无法百分之百确定他们的做法,但有没有更好的方法来了解如何调整大小?上面的代码不是估计这个的好方法吗?

我非常确定你的结论是正确的:没有花哨的算法,MATLAB只为数组分配所需的空间。MATLAB根本不适用于对数组/列表进行“追加”操作。 - sebastian
1
虽然预分配是推荐的方法,但请看我的答案,涉及到算法方面。它似乎变得更加智能了。 - chappjc
2个回答

6

来自MathWorks软件开发经理Steve Eddins:

MATLAB使用比简单地在需要更多内存空间时将已分配的内存空间加倍更智能的启发式方法,因此对于大型数组,最坏情况下的内存“过度分配”要少得多。 我不打算在这里进一步详细说明,因为(a)我不知道它们,(b)我希望我们将在未来的版本中继续调整启发式和自动数组增长的其他方面。

因此,可以放心地说它不是一次为一个元素分配空间,而是会进行某种程度的过度分配。 此外,正如Alexandre Bizeau所指出的那样,内存将是连续的。

另请参见this page以获取有关数组增长性能的分析。


4
当您将数字或字符数组分配给变量时,MATLAB会分配一个连续的虚拟内存块,并将数组数据存储在该块中。MATLAB还在一个称为标头的单独小内存块中存储有关数组数据的信息,例如它的类和尺寸。
如果您向现有数组添加新元素,则MATLAB会以保持其存储连续的方式在内存中扩展现有数组。这通常需要找到一个足够大的新内存块来容纳扩展后的数组。然后,MATLAB将数组内容从原始位置复制到此新内存块中,在此块中向数组添加新元素,并释放原始数组位置中的内存。
来源: 创建和修改数组

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接