Performance Matlab预分配与不分配相比,第二个更快,为什么?
大约三个月前,我在Matlab中运行一个示例,发生了一些奇怪的事情。今天,当我在测试另一个问题()的答案时,又发生了一次。这是关于Matlab中的预分配。让我解释一下: 考虑一下这个测试代码,我们尝试用三种方式创建矩阵(Performance Matlab预分配与不分配相比,第二个更快,为什么?,performance,matlab,Performance,Matlab,大约三个月前,我在Matlab中运行一个示例,发生了一些奇怪的事情。今天,当我在测试另一个问题()的答案时,又发生了一次。这是关于Matlab中的预分配。让我解释一下: 考虑一下这个测试代码,我们尝试用三种方式创建矩阵(ones(100100)): 无预分配(声明I=[]) 预分配(声明I=0(100100)) 完全没有分配(我不声明任何内容) 代码: 结果是: sum0 =1.53790886830589 //no pre-allocation sum1 = 0.127538555877
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以来变得不那么重要了,但它仍然会使代码更快(并在更合理的地方抛出内存不足的错误)。