我有这样一段代码向量化代码 - 如何减少MATLAB计算时间
N=10^4;
for i = 1:N
[E,X,T] = fffun(); % Stochastic simulation. Returns every time three different vectors (whose length is 10^3).
X_(i,:)=X;
T_(i,:)=T;
GRID=[GRID T];
end
GRID=unique(GRID);
% Second part
for i=1:N
for j=1:(kmax)
f=find(GRID==T_(i,j) | GRID==T_(i,j+1));
s=f(1);
e=f(2)-1;
counter(X_(i,j), s:e)=counter(X_(i,j), s:e)+1;
end
end
代码执行一个随机过程(它由10^3点的事件,在离散的时刻发生的N个不同的模拟(T (第二部分)作为时间的函数,我想知道在一个特定的状态下有多少个模拟(X取值在1到10之间)。我有这样的想法:创建一个具有所有时刻的网格矢量,然后,在模拟上循环,循环发生某些事情的时间步并递增与此p相对应的所有计数器余数时间的关键片段。
然而,这第二部分是非常重的(我的意思是在一个标准的四核CPU上处理几天)。它不应该。 是否有任何想法(可能是以更高效的方式比较向量)来缩短CPU时间?
这是一个独立 'SECOND_PART'
N=5000;
counter=zeros(11,length(GRID));
for i=1:N
disp(['Counting sim #' num2str(i)]);
for j=1:(kmax)
f=find(GRID==T_(i,j) | GRID==T_(i,j+1),2);
s=f(1);
e=f(2)-1;
counter(X_(i,j), s:e)=counter(X_(i,j), s:e)+1;
end
end
counter=counter/N;
stop=find(GRID==Tmin);
stop=stop-1;
plot(counter(:,(stop-500):stop)')
具有相关联的伪数据(filedropper.com/data_38)。在真实的情况下,矩阵有2x行和10x列。
如果这需要*天*我几乎可以肯定,大部分时间来自'fffun'。尝试用一个小'N'来分析你的代码 –
你是否预分配了'counter'? – horchler
@Adriaan不幸的是,情况并非如此。第一部分不到一分钟。在第二部分中没有未分配的变量。 :( –