我有這樣一段代碼向量化代碼 - 如何減少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不幸的是,情況並非如此。第一部分不到一分鐘。在第二部分中沒有未分配的變量。 :( –