在我看来,答案比@natan描绘的要复杂得多.
我认为他的答案没有考虑到两个因素:
>可能需要的内存副本:当您低估矩阵大小并重新分配它时,应将其所有旧值复制到新分配的位置.
>内存块的连续性:有时Matlab能够在旧矩阵的末尾连续分配新的内存.原则上,在这种情况下,旧值不需要复制到新位置 – 因为它与旧的位置相同.但是,如果将行添加到2D矩阵,则即使在此场景中也需要复制内容,因为Matlab以行主要方式将矩阵存储在内存中.
所以,我的答案是这样的:
首先,你究竟对矩阵的大小知之甚少:如果你知道一个维度 – 将它作为矩阵的行数,那么你只需要改变列数.这样,如果您需要复制已存储的数据,则会以较大的块复制它.
其次,它取决于你拥有多少可用RAM.
如果你不吝啬RAM,那么过度估算并没有错.
但是,如果您缺少RAM,请考虑进行估算.但是当您重新分配时,在每次迭代时增加新的块大小:
BASIC_SIZE = X; % first estimate
NEW_SIZE = Y; % if need more, add this amount
factor = 2;
arr = zeros( m, BASIC_SIZE ); % first allocation, assuming we know number of rows
while someCondition
% process arr ...
if needMoreCols
arr(:, size(arr,2) + (1:NEW_SIZE) ) = 0; % allocate another block
NEW_SIZE = round(NEW_SIZE * factor); % it seems like we are off in estimation, try larger chunk next time factor should be > 1
end
end
arr = arr(:, 1:actualNumOfCols ); % resize to actual size, discard unnecessary columns