2012-11-26 59 views
6

我有一個1秒的86400風速(WS)值在Matlab中的數據集,需要過濾它的幫助。它需要一定程度的聰明。Brain teaser - 使用移動平均數的過濾算法

如果平均WS超過:

  • 25米/ s的在600秒的時間間隔
  • 28米/秒在一個30秒的時間間隔
  • 30米/ s的在3秒時間間隔

如果滿足這些參數中的任何一個,則在300秒的時間間隔內平均WS保持在22m/s以下之前,WS被視爲「無效」。

下面是我對600秒的要求。我對「數據集」中包含的數據做了600秒和300秒的移動平均數。我從平均25m/s的第一次出現到下一次出現低於22m/s的數值的時間間隔過濾爲「NaN」。過濾後,我會再做600秒的平均值,並且帶有用NaN標記的值的間隔將保留爲NaN。

Rolling600avg(:,1) = tsmovavg(dataset(:,2), 's', 600, 1); 

Rolling300avg(:,1) = tsmovavg(dataset(:,2), 's', 300, 1); 

a = find(Rolling600avg(:,2)>25) 

b = find(Rolling300avg(:,2)<22) 

dataset(a:b(a:find(b==1)),2)==NaN; %?? Not sure 

這將需要巧妙地利用「查找」和一些索引。有人可以幫我嗎? 28m/s和30m/s過濾器將遵循相同的方法。

+0

這不是說它與解決問題過度相關,但我猜測「WS」是指風速? – Mac

+0

是的,謝謝。我補充說。 – user1854628

+0

你想用最後一條語句做什麼? – jerad

回答

1

如果我遵循你的問題,一種方法是使用for循環來確定NaN應該在哪裏開始和結束。

m = [19 19 19 19 28 28 19 19 28 28 17 17 17 19 29 18 18 29 18 29]; %Example data 
a = find(m>25); 
b = find(m<22); 
m2 = m; 
% Use a loop to isolate segments that should be NaNs; 
for ii = 1:length(a) 
    firstNull = a(ii) 
    lastNull = b(find(b>firstNull,1))-1 % THIS TRIES TO FIND A VALUE IN B GREATER THAN A(II) 
    % IF THERE IS NO SUCH VALUE THEN NANS SHOULD FILL TO THE END OF THE VECTOR 
    if isempty(lastNull), 
     lastNull=length(m); 
    end 
    m2(firstNull:lastNull) = NaN 
end 

請注意,這隻適用於tsmovavg返回與傳遞給它的長度相等的向量。如果不是,那麼它會更棘手,需要進行一些修改。

可能有某種避免for循環的方法,但這是一個非常簡單的解決方案。

+1

是的,我認爲這應該工作。有3個單獨的情況,所有情況在WS低於22米/秒300秒時結束。這是一種情況: m1 = tsmovavg(dataset,'s',300,1); m2 = tsmovavg(dataset,'s',600,1); a = find(m1 <22); b = find(m2> 25); m21 = m2; %使用循環來隔離應該是NaN的段;如果isempty(lastNull), lastNull = length(m2);如果isempty(lastNull), lastNull = b(ii) lastNull = a(find(a> firstNull,1)) - end m21(firstNull:lastNull)= NaN; 結束 – user1854628

+1

是的,您必須將此方法應用於所有條件。我希望這有助於。如果它解決了您的問題,請隨時通過查看我答覆旁邊的複選標記來接受我的答案。 – jerad