考虑预先分配速度

时间:2010-01-28 01:13:50

标签: matlab memory-management

我正在做以下

for i = 1:m,
    index = 0;
    for j = 1:n,
        index = index+values(i,j)*2^(j-1);
        if (j==1)
            symbol_chip = chip_values(index+1,:);
        else
            symbol_chip = [symbol_chip chip_values(index+1,:)];
        end
    end
end

它告诉我以下内容:

  

symbol_chip可能会在循环中增长。考虑预先分配速度。

有什么想法吗?

2 个答案:

答案 0 :(得分:10)

是。每次您到处走动时,elseif区块都会调整symbol_chip的大小,这很昂贵。相反,重写代码,以便在循环之前(例如)symbol_chip = zeros(max_size, 1);。然后,更改内容,但不更改symbol_chip的大小。

您需要稍微改变一下您的方法,但如果您这样做会更快。如果你不对目前的速度感到恼火,不要改变任何东西!

答案 1 :(得分:2)

如果你有一个变量在循环内增长而没有预先分配,M-Lint会抛出这个警告。您可以通过预先分配集合变量来删除此错误。

例如,如果你知道变量symbol_chip最多只有i * j个元素,你可以用语句预先分配它:

symbol_chip = zeros(i*j);

但是,对于大多数应用程序,预分配对算法性能的影响可以忽略不计。如果你处理非常大的数据集,我只会担心它。