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 的 ArrayList 的 Java 实现中的方法进行对比,该方法分配了足够的空间,因此每次调整大小都不需要在超出初始界限的每个分配上发生。显然,由于 Matlab 不是开源的,因此无法 100% 说明他们在做什么,但是有没有更好的方法来了解如何调整大小?上面的代码不是估计这个的好方法吗?

4

2 回答 2

6

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

MATLAB 使用一种更智能的启发式算法,而不是在需要更多时简单地将分配的内存空间加倍,因此对于大型数组,最坏情况下的内存“过度分配”远小于两倍。我不打算在这里详细介绍,因为 (a) 我不了解它们,并且 (b) 我希望我们将在未来的版本中继续调整自动数组增长的启发式和其他方面。

因此,可以肯定地说它不是一次为一个元素分配空间,而是在某种程度上过度分配。此外,正如 Alexandre Bizeau 所指出的,内存将是连续的。

此外,请参阅此页面以了解阵列增长的性能分析。

于 2013-09-27T22:24:41.910 回答
4

当您将数值或字符数组分配给变量时,MATLAB 会分配一个连续的虚拟内存块并将数组数据存储在该块中。MATLAB 还将有关数组数据的信息(例如其类和维度)存储在称为标头的单独的小内存块中。

如果您向现有数组添加新元素,MATLAB 会以保持其存储连续的方式扩展内存中的现有数组。这通常需要找到一个足够大的新内存块来容纳扩展数组。然后,MATLAB 将数组的内容从其原始位置复制到内存中的这个新块,将新元素添加到该块中的数组,并释放内存中的原始数组位置。

来源:创建和修改数组

于 2013-09-27T22:25:18.803 回答