如何预分配使用horzcat和vertcat增长的数组

时间:2015-11-28 14:01:36

标签: arrays performance matlab

只要数组在循环中增长,只要我们知道将要发生的迭代次数,我们就可以在循环之前轻松地使用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)进行逐行连接,则会发生同样的情况。

1 个答案:

答案 0 :(得分:4)

首先,重写您的代码以与预分配兼容。使用像

这样的东西
M(k+1:k+numel(v))=v'
k=k+numel(v)

使用K来跟踪您真正使用的空间。在分配的额外空间结束时:

M=M(1:k)

现在,您可以尝试不同的策略,在阵列已满时分配可能的最大值(如果已知),双倍大小等。分配预期或最可能的大小。这取决于您的问题。