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

Mic*_*l A 4 matlab memory-management matrix dynamic-arrays

运行此代码:

n = 5;
x = zeros(n, 1);
for ix=1:10
   x(ix) = rand();
   disp(getfield(whos('x'), 'bytes'))
end
Run Code Online (Sandbox Code Playgroud)

输出:

40
40
40
40
40
48
56
64
72
80
Run Code Online (Sandbox Code Playgroud)

这似乎表明,当Matlab调整矢量大小时,它会调整大小以使其具有所需的空间,而不是更多.所以,一次只有一个元素.

将此与Sun的Java Array实现中方法进行对比,后者分配了足够的空间,以便每次调整都不需要在初始边界之上的每个赋值上进行.显然,由于Matlab不是开源的,所以没有办法告诉100%他们做了什么,但有没有更好的方法来了解调整大小是如何完成的?上面的代码不是估计这个的好方法吗?

cha*_*pjc 6

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

MATLAB使用更智能的启发式方法,而不是只需要在需要更多内容时将分配的内存空间加倍,因此对于大型数组,最坏情况内存"过度分配"远小于两倍.我不打算在此深入了解详情,因为(a)我不了解它们,(b)我希望我们将继续调整自动阵列增长的启发式和其他方面以及将来的版本.

因此,可以肯定地说它不是一次为一个元素分配空间,而是在某种程度上进行了分配.此外,如Alexandre Bizeau所述,记忆将是连续的.

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