【发布时间】:2017-07-14 04:40:39
【问题描述】:
我有这段代码
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
代码执行随机过程的 N 个不同模拟(由 10^3 个事件组成,发生在离散时刻(T 向量),具体取决于具体模拟。 现在(第二部分)我想知道,作为时间的函数,有多少模拟处于特定状态(X 假设值在 1 到 10 之间)。我的想法是:创建一个网格向量,其中包含在任何模拟中发生的所有时刻。然后,遍历模拟,遍历发生某些事情的时间步长,并递增与该特定时间片相对应的所有计数器 indeces。
但是,第二部分非常繁重(我的意思是在标准四核 CPU 上处理的天数)。它不应该。 是否有任何想法(也许是关于以更有效的方式比较向量)来减少 CPU 时间?
这是一个独立的“第二部分”
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吗? -
@Adriaan 不幸的是,情况并非如此。第一部分不到一分钟。在第二部分中没有未分配的变量。 :(
-
@AnderBiguri 并非如此。第一部分不到一分钟。 :(
-
@horchler 是的,我正在预分配它。
标签: matlab performance time cpu