2012-11-26 33 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