运行这段代码:
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% 告诉他们做了什么,但是有没有更好的方法来了解调整大小是如何完成的?上面的代码不是估计这个的好方法吗?
From 数学工厂' 软件开发经理 Steve Eddins:
MATLAB 使用更智能的启发式方法,而不是在需要更多内存空间时简单地将分配的内存空间加倍,因此对于大型数组,最坏情况的内存“过度分配”远小于两倍。我不打算在这里讨论更多细节,因为(a)我不知道它们,(b)我希望我们将在未来的版本中继续调整自动数组增长的启发式和其他方面。
因此,可以肯定地说,它不会一次为一个元素分配空间,而是在某种程度上过度分配。此外,正如 Alexandre Bizeau 所指出的,内存将是连续的。
另请参阅这一页用于阵列生长性能分析。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)