<>没人来挑战一下么?那我先来抛砖引玉吧,并介绍提高matlab速度的第一个要点.</P><>提高matlab速度的第一个要点(楼上的也已经指出来了,大矩阵的预先定维),从例子看起吧:</P><>例:若我们先执行赋值语句(1):</P><P>Array=[1,3,5];</P><P>查看Array,其中元素为:1 3 5, 是一个1*3的矩阵</P><P>再执行赋值语句(2);</P><P>Array(2,=[2,4,6];</P><P>此时,我们再查看Array,其中元素变为:</P><P>[1 3 5;</P><P> 2 4 6]; 是一个2*3的矩阵.</P><P>在上面对Array赋值的过程中,我们犯了一个错误.为了理解它,我们需要先了解一下matlab的内存使用方式,</P><P>当我们首先执行语句(1)时,matlab请求了一个1*3的连续内存来存放数组Array;当继续执行语句(2)时,因为需要更大的存储空间来存放Array这个数组,所以原来的内存空间要先被释放,然后再去向编译器和系统申请一个更大的连续的内存空间,也就是说增加了系统开销.当所涉及到的数组很大,或被重新赋值很多次(比如说在for循环中多次使用),那么内存分配的系统开销就会显著地降低算法的速度.</P><P>为了解决这个问题,(提高matlalb运行速度的第一个要点)在编程时应当尽量首先分配所需的所有内存,然后再根据需要一步步赋值.以上面的情况为例,也就是应该改成:</P><P>Array=ones(2,3);</P><P>Array(1,=[1,3,5];</P><P>Array(2,=[2,4,6];</P><P>将刚刚说过的这个要点用于本题,我们首先可以经过第一次提升速度的matlab程序:</P><P>Nums = 25:50; % numbers to test
Counts=zeros(size(Nums)); % preallocate array
for i=1:length(Nums)
N=Nums(i); % number to test
count = 0; % iteration count
while N>1
if rem(N,2)==0 % even
N=N/2;
count=count+1;
else % odd
N=(3*N+1)/2;
count=count+2;
end
end
Counts(i)=count;
end
results=[Nums' Counts']</P><P>上面的这个只是初步经过优化的程序,其中的for循环还有些是可以通过向量化的方法去掉的.谁有兴趣继续试试?</P> |