只要数组在循环中增长,只要我们知道将要发生的迭代次数,我们就可以在循环之前轻松地使用zeros
预分配它。
但是,有些情况下我们根本不知道确切的迭代次数,例如当我们有一个先前必须满足的条件来增长数组时。
对于这样的情况,因为我不知道输出数组的大小,我不知道如何预分配。
以下面的伪代码为例:
M = []; % Declare empty array.
for i = 1:n % This loop performs n iterations.
if(condition == true)
% Computations take place here
% and yield an array --> v
M = horzcat(M,v'); % Concatenate v as a new column of M.
end
end
在这种情况下,您如何预先分配M
?
请注意,对于满足条件的迭代,horzcat(M,v')
用于逐列增长M
。因此,如果我们使用vertcat(M,v)
进行逐行连接,则会发生同样的情况。
答案 0 :(得分:4)
首先,重写您的代码以与预分配兼容。使用像
这样的东西M(k+1:k+numel(v))=v'
k=k+numel(v)
使用K来跟踪您真正使用的空间。在分配的额外空间结束时:
M=M(1:k)
现在,您可以尝试不同的策略,在阵列已满时分配可能的最大值(如果已知),双倍大小等。分配预期或最可能的大小。这取决于您的问题。