2015-05-26 20 views
0

如何在下面的Matlab代碼中更高效?使用一個while循環?如果語法符合我的目的,我將不得不繼續添加更多。任何幫助將非常感激。如何更有效

TimeLagM = 6;2;3;1;2;10;25;60;2;5;10;80;24;1;2;3; 

p=0; 
count=zeros(length(TimeLagM),1)); 

for i=4:length(TimeLagM) 
    if TimeLagM(i,1)>30 
    count(i,1)=count(i,1)+0; 
    elseif TimeLagM(i,1)==30 
    count(i,1)=count(i,1)+1; 
    elseif TimeLagM(i,1)<30 
     p=TimeLagM(i,1)+TimeLagM(i-1,1); 
     if p>30 
     count(i,1)=count(i,1)+1; 
     elseif p==30 
     count(i,1)=count(i,1)+2; 
     elseif p<30 
      p=p+TimeLagM(i-2,1); 
      if p>30 
      count(i,1)=count(i,1)+2; 
      elseif p==30 
      count(i,1)=count(i,1)+3; 
      elseif p<30 
       p=p+TimeLagM(i-3,1); 
       if p>30 
       count(i,1)=count(i,1)+3; 
       elseif p==30 
       count(i,1)=count(i,1)+4; 
       elseif p<30 
       count(i,1)=count(i,1)+5; 

       end 
      end 
     end 
    end 
end 
+0

elseif p <30 p = p + TimeLagM(i-2,1); p正在改變與TimeLagM(i-2,1) – user2797174

回答

0

這給了相同的結果,你的代碼:

TimeLagM = [6;2;3;1;2;10;25;60;2;5;10;80;24;1;2;3]; 

thresh = 30; 
maxBack = 3; 

p=0; 
count=zeros(length(TimeLagM),1); 

for i=maxBack+1:length(TimeLagM) 
    p = TimeLagM(i); 
    s = 0; 
    while (s < maxBack && p < thresh) 
     s = s + 1; 
     p = p + TimeLagM(i-s); 
    end 

    if p > thresh 
     count(i) = count(i) + s + 0; % i don't know what these values mean 
    elseif p == thresh    % so i couldn't give them meaningful names 
     count(i) = count(i) + s + 1; 
    else % p < thresh 
     count(i) = count(i) + s + 2; 
    end 
end 

while循環計算p的款項並記​​住它有多少個元素回去s。這樣你只需要在一個地方計算count。這假設count將來可能被初始化爲零以外的東西;否則,您可以縮短分配至count(i) = s + 0(或1或2)。

給出的數據結果是:

count' = 

    0 0 0 5 5 5 1 0 1 2 3 0 1 2 3 4 

對於情況下,當我們沒有對maxBack一個固定值,我們要保持遞增s只要i-(s+1)是有效的索引或大於零(+1是因爲我們立即在循環中增加它)。這意味着我們想要(i-s) > 1,我們可以從1開始for環路,而不是maxBack+1

for i=1:length(TimeLagM) 
    ... 
    while ((i-s) > 1 && p < thresh) 
    ... 

如果你想繼續做雙方的選擇,有一個固定的maxBack與否,您可以在您的while循環中的所有三個條件:

while ((i-s) > 1 && s < maxBack && p < thresh) 

然後,如果你不這樣做想要指定maxBack,只需設置maxBack = intmax。 (實際上,任何值length(TimeLagM) - 1或更大的值都可以工作。)

+0

總結這是非常好的!謝謝「燒杯...... maxBack未知時的任何建議 – user2797174

+0

如果我們只知道總和爲最大值30(即thresh = 30),您希望返回的元素數量僅受限於輸入矩陣的範圍? – beaker

+0

)但不知道maxBack = 3 – user2797174