我在Matlab中有1秒86400风速(WS)值的数据集,需要帮助过滤它。它需要一定程度的聪明才智。
如果平均WS超过:
如果满足这些参数中的任何一个,则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
这需要巧妙地使用'find'和一些索引。有人可以帮帮我吗? 28米/秒和30米/秒的过滤器将采用相同的方法。
答案 0 :(得分: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循环的方法,但这是一个非常直接的解决方案。