Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Matlab预分配与不分配相比,第二个更快,为什么?_Performance_Matlab - Fatal编程技术网

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

Performance Matlab预分配与不分配相比,第二个更快,为什么?,performance,matlab,Performance,Matlab,大约三个月前,我在Matlab中运行一个示例,发生了一些奇怪的事情。今天,当我在测试另一个问题()的答案时,又发生了一次。这是关于Matlab中的预分配。让我解释一下: 考虑一下这个测试代码,我们尝试用三种方式创建矩阵(ones(100100)): 无预分配(声明I=[]) 预分配(声明I=0(100100)) 完全没有分配(我不声明任何内容) 代码: 结果是: sum0 =1.53790886830589 //no pre-allocation sum1 = 0.127538555877

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

考虑一下这个测试代码,我们尝试用三种方式创建矩阵(
ones(100100)
):

  • 无预分配(声明
    I=[]
  • 预分配(声明
    I=0(100100)
  • 完全没有分配(我不声明任何内容)
  • 代码:

    结果是:

    sum0 =1.53790886830589    //no pre-allocation
    sum1 = 0.127538555877912  //with pre-allocation
    sum2 = 0.120887850271473  //no allocation
    
    第三种方法(我不写
    I=[]
    I=zero(100100)
    )是最好的方法!这件事也发生在我以前的工作中。(请参阅更新部分)


    此方法与第一个和第二个方法有什么区别?

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

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

    编辑也可以使用隐式预分配,即向后循环,以便分配的第一个元素定义整个数组:

    for i=100:-1:1
        for j=100:-1:1
           I(i,j) = 1;
        end
    end
    

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

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

    编辑也可以使用隐式预分配,即向后循环,以便分配的第一个元素定义整个数组:

    for i=100:-1:1
        for j=100:-1:1
           I(i,j) = 1;
        end
    end
    

    ... 或者在部分之间清除I,删除工作区变量。哈哈,这么简单,从来没有想过。所以每次分配确实很重要。@Ron:在一个简单的(不是双重的)循环中,预分配自R2012a以来变得不那么重要了,但它仍然会使代码更快(并在更合理的地方抛出内存错误)。。。。或者在部分之间清除I,删除工作区变量。哈哈,这么简单,从来没有想过。所以每次分配确实很重要。@Ron:在一个简单的(不是双重的)循环中,预分配自R2012a以来变得不那么重要了,但它仍然会使代码更快(并在更合理的地方抛出内存不足的错误)。