【问题标题】:Brain teaser - filtering algorithm using moving averages脑筋急转弯 - 使用移动平均线的过滤算法
【发布时间】:2012-11-26 20:57:56
【问题描述】:

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

如果平均 WS 超过:

  • 25m/s,600s 时间间隔
  • 28m/s,30s 时间间隔
  • 3 秒时间间隔内 30 米/秒

如果满足这些参数中的任何一个,则 WS 被视为“无效”,直到平均 WS 在 300 秒的时间间隔内保持在 22m/s 以下。

这是我对 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 过滤器将遵循相同的方法。

【问题讨论】:

  • 并不是说它与解决问题过于相关,但我猜“WS”是指风速?
  • 好的,谢谢。我添加了那个。
  • 你想用最后的语句做什么?
  • 好的,我想我明白你要做什么了。那么,您最后的陈述是否按预期工作?如果不是,它会返回错误吗?

标签: matlab filter indexing find octave


【解决方案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 循环,但这是一个非常直接的解决方案。

【讨论】:

  • 是的,我认为这应该可行。有 3 种单独的情况,均在 WS 小于 22m/s 持续 300 秒时结束。这是一种情况: m1 = tsmovavg(dataset, 's', 300, 1); m2 = tsmovavg(数据集, 's', 600, 1); a = 查找(m125); m21 = m2; % 使用循环来隔离应该是 NaN 的段;对于 ii = 1:length(b) firstNull = b(ii) lastNull = a( find(a>firstNull,1) )-1 if isempty(lastNull), lastNull=length(m2);结束 m21(firstNull:lastNull) = NaN;结束
  • 是的,您必须将此方法应用于您的所有条件。我希望这会有所帮助。如果它解决了您的问题,请随时通过检查我的回复旁边的复选标记来接受我的回答。
猜你喜欢
  • 2020-05-04
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2017-05-30
  • 2014-08-03
相关资源
最近更新 更多