2012-11-26 17 views
6

私はMatlabの86400風速(WS)値の1秒のデータセットを持っており、それをフィルタリングする際に助けが必要です。一定のレベルの賢さが必要です。脳ティーザー - 移動平均を使用したフィルタリングアルゴリズム

平均WSを超えた場合:

  • 25メートル/秒の30秒の時間間隔
  • 3秒の時間間隔
で30メートル/秒で600S時間間隔
  • 28メートル/秒

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

    ここには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のフィルターは同じ方法に従います。

  • +0

    問題を解決するにはあまり関係はありませんが、「WS」では風速を意味すると思いますか? – Mac

    +0

    はい、ありがとうございます。私はそれを付け加えた。 – user1854628

    +0

    最後の声明で何をしようとしていますか? – jerad

    答えて

    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ループを回避する方法がありますが、これはかなり簡単な解決策です。

    +1

    はい、これはうまくいくと思います。 3つの別々のケースがあり、すべてがWSが22秒/ 300秒未満で終了する。これは1つのケースです。 m1 = tsmovavg(dataset、 's'、300、1); m2 = tsmovavg(dataset、 's'、600、1); a = find(m1 <22); b = find(m2> 25); m21 = m2; %ループを使用して、NaNであるセグメントを分離します。 for ii = 1:length(b) firstNull = b(ii) lastNull = a(find(a> firstNull、1))-1 isempty(lastNull)、 lastNull = length(m2); end m21(firstNull:lastNull)= NaN; end – user1854628

    +1

    はい、すべての条件にこのメソッドを適用する必要があります。私はこれが助けて欲しい問題が解決した場合は、自分の回答の横にあるチェックボックスをオンにして、私の答えを受け入れるようにしてください。 – jerad

    関連する問題