6

Matlabに86400の風速(WS)値の1秒のデータセットがあり、それをフィルタリングするための支援が必要です。それにはある程度の賢さが必要です。

平均WSが次を超える場合:

  • 600秒間隔で25m/s
  • 30秒間隔で28m/s
  • 3秒の時間間隔で30m/s

これらのパラメータのいずれかが満たされた場合、平均WSが300秒の時間間隔で22m / sを下回るまで、WSは「無効」と見なされます。

これが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」の巧妙な使用といくつかのインデックス付けが必要になります。誰かが私を助けてくれますか?28m/sと30m/sのフィルターは同じ方法に従います。

4

1 に答える 1

1

私があなたの質問に従う場合、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ループを回避する方法はおそらくいくつかありますが、これは非常に簡単な解決策です。

于 2012-11-26T22:28:06.770 に答える