首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab预分配与无分配相比,第二个更快,为什么?

Matlab预分配与无分配相比,第二个更快,为什么?
EN

Stack Overflow用户
提问于 2012-12-24 15:14:14
回答 1查看 190关注 0票数 0

大约三个月前,我在Matlab中运行了一个样本,发生了一些奇怪的事情。今天,当我测试我的另一个问题(How can I sort the elements of a cell?)的答案时,又发生了一次。它是关于在Matlab中的预分配.让我解释一下:

考虑下面的测试代码,我们尝试以三种方式创建一个矩阵(ones(100,100)):

  1. 没有预先分配(声明I=[])
  2. 使用预分配(声明I=zeros(100,100))
  3. 根本不分配(我什么也不申报)

代码:

代码语言:javascript
复制
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

研究结果如下:

代码语言:javascript
复制
sum0 =1.53790886830589    //no pre-allocation
sum1 = 0.127538555877912  //with pre-allocation
sum2 = 0.120887850271473  //no allocation

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-24 15:19:04

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

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

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

代码语言:javascript
复制
for i=100:-1:1
    for j=100:-1:1
       I(i,j) = 1;
    end
end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14022979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档