大约三个月前,我在 Matlab 中运行一个示例,发生了一些奇怪的事情。今天,当我测试我的另一个问题(如何对单元格的元素进行排序?)的答案时,又发生了。这是关于Matlab中的预分配。让我解释一下:
ones(100,100)
考虑这个测试代码,我们在其中尝试以三种方式创建矩阵 ( ):
- 没有预分配(声明
I=[]
) - 带预分配(声明
I=zeros(100,100)
) - 根本没有分配(我什么都不声明)
代码:
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)
)是最好的方法!这也发生在我之前的问题中。(见更新部分)
这种方法与第一种和第二种方法有什么区别?