0

大约三个月前,我在 Matlab 中运行一个示例,发生了一些奇怪的事情。今天,当我测试我的另一个问题(如何对单元格的元素进行排序?)的答案时,又发生了。这是关于Matlab中的预分配。让我解释一下:

ones(100,100)考虑这个测试代码,我们在其中尝试以三种方式创建矩阵 ( ):

  1. 没有预分配(声明I=[]
  2. 带预分配(声明I=zeros(100,100)
  3. 根本没有分配(我什么都不声明)

代码:

N=1000;
sum0=0;sum1=0;sum2=0;
for q=1:N

    % No pre-allocating
    tic
    I=[];
    for i=1:100
        for j=1:100
            I(i,j)=1;
        end
    end
    a=toc;sum0=sum0+a;

    % with pre-allocation
    tic
    I=zeros(100,100);
    for i=1:100
        for j=1:100
            I(i,j)=1;
        end
    end
    a=toc;sum1=sum1+a;

    % if nothing is declared, I call it no-allocation
    tic
    for i=1:100
        for j=1:100
            I(i,j)=1;
        end
    end
    a=toc;sum2=sum2+a;
end

结果是:

sum0 =1.53790886830589    //no pre-allocation
sum1 = 0.127538555877912  //with pre-allocation
sum2 = 0.120887850271473  //no allocation

第三种方法(我不写I=[]or的地方I=zeros(100,100))是最好的方法!这也发生在我之前的问题中。(见更新部分)

这种方法与第一种和第二种方法有什么区别?

4

1 回答 1

4

第三次运行循环时,I工作空间中已经存在。因此,循环与第二个循环一样快,只是您不再调用zeros

我建议在计算时间(或在每个循环之前调用;感谢@EitanT)时I替换第二次JK第三次以避免错误。clear I

编辑作为替代方案,您可以使用隐式预分配,在其中向后循环,以便您分配的第一个元素定义整个数组:

for i=100:-1:1
    for j=100:-1:1
       I(i,j) = 1;
    end
end
于 2012-12-24T15:19:04.880 回答