2015-07-21 20 views
0

我正在使用64GB RAM的Xeon四核处理器。运行该功能的程序只有89个数据点。现在已经超过20分钟了,MATLAB仍然在忙于计算这个程序。下面的代码是否显示计算需要花费很长时间的原因?MATLAB:运行20分钟以上的短功能

function last15MinsOfDay=last15MinsOfDay(time,price) 
% last15MinsOfDay takes the average of prices between 3:45 and 4:00. 
timeStr=cellstr(datestr(time)); 
timeDbl=datevec(timeStr); 
times=and(timeDbl(:,4)==14,timeDbl(:,5)>=45)+and(timeDbl(:,4)==15,timeDbl(:,5)==0); 
priceIdx=find(times); 
z=find(fwdshift(1,priceIdx)~=priceIdx+1); 
z=[1; z]; 
mu=zeros(length(z),1); 
for i = 1:length(z); 
    while i < length(z) 
     mu(i)=mean(price(priceIdx(z(i):z(i+1)))); 
    end 
end 
last15MinsOfDay=mu; 

回答

4

我在MATLAB专家,但这一部分看起来很滑稽:

for i = 1:length(z); 
    while i < length(z) 
     mu(i)=mean(price(priceIdx(z(i):z(i+1)))); 
    end 
end 

具体来说,我没有看到i递增在内部循环,使内循环将无限期地运行。

+0

你明白了!谢谢! – kits

3

为了补充esm的答案,你有两个循环,每个循环都使用相同的变量i,所以这会导致while循环中的错误,因为变量i由for循环在每次迭代中重新定义(在应用esm之后更正)。要了解我的意思的例子,尝试下面的代码,并期待在输出:

z = 1:10; 
for i = 1:(length(z)); 
    while i < length(z) 
     disp(['while loop:' num2str(i)]); 
     i = i+1; 
    end 
    disp(['for loop:' num2str(i)]); 
end 

此外,因为双循环的,你用相同的数据改写为变量m(i)浪费了大量的处理时间

我有一种感觉,这是你打算做的事:

for i = 1:length(z)-1; 
     mu(i)=mean(price(priceIdx(z(i):z(i+1)))); 
end 

我只是删除了嵌套while循环,因为它并没有真正服务于一个目的,吃了加工时间,后来我改变length(z)length(z) - 1以避免index out of bounds错误。

最后,你的脚本只会使用你的一个处理器内核,所以在这里使用qaud核心处理器不会给你任何速度优势。要使用所有4个内核,请尝试使用parfor而不是for,理论上可以将处理速度提高四倍。 http://nl.mathworks.com/help/distcomp/parfor.html