gpt4 book ai didi

matlab - 脑筋急转弯 - 使用移动平均线的过滤算法

转载 作者:太空宇宙 更新时间:2023-11-03 19:37:04 24 4
gpt4 key购买 nike

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

如果平均 WS 超过:

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

如果满足这些参数中的任何一个,则 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 过滤器将遵循相同的方法。

最佳答案

如果我回答你的问题,一种方法是使用 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 循环,但这是一个非常直接的解决方案。

关于matlab - 脑筋急转弯 - 使用移动平均线的过滤算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com