Brain teaser - 使用移动平均线的过滤算法

use*_*628 6 indexing matlab filter find octave

我在Matlab中有1秒钟的86400风速(WS)值数据集,需要过滤它的帮助.它需要一定程度的聪明才智.

如果平均WS超过:

  • 在600秒的时间间隔内为25米/秒
  • 在30秒的时间间隔内28米/秒
  • 在3秒的时间间隔内30米/秒

如果满足这些参数中的任何一个,则WS被认为是"无效的",直到平均WS在300秒的时间间隔内保持低于22m/s.

这就是我对600秒要求的要求.我对'dataset'中包含的数据进行了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
Run Code Online (Sandbox Code Playgroud)

这需要巧妙地使用'find'和一些索引.有人可以帮帮我吗?28米/秒和30米/秒的过滤器将采用相同的方法.

jer*_*rad 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
Run Code Online (Sandbox Code Playgroud)

请注意,只有当 tsmovavg 返回与传递给它的向量长度相等的向量时,这才有效。如果不是的话,那就更棘手了,需要进行一些修改。

可能有某种方法可以避免 for 循环,但这是一个非常简单的解决方案。