質問: 時系列データから0以外の塊をとりだして処理するには よろしくお願いいたします。時系列データの例をあげます。 蛇口からの出る水の流量をはかっているデータだと、 時系列データは、基本数値の0が続いて、ときたま0以外の正の数値(流量や温度)が連続してはいってます。 この時系列データから、一回目、二回目、三回目、、、の蛇口からでる流量値を、処理していきたいのです。 たとえば、 1流れ出して10秒後から20秒後まで、または最後までの流量の平均値 2流れ出して10秒後から20秒後まで、または最後までの温度の平均値 3流量や温度の最大値 こういった処理をするには、どうやったら効率的に処理できるでしょうか。
回答: ライブ エディターでデータ内の急激な変化を検出 - matlab - mathworks 日本 データの急激な変化の検出 - matlab ischange - mathworks 日本 ischange関数を使いました。閾値の指定や平均・分散を得る機能がありますが使いませんでした。「データがゼロから変化する部分(測定の始まり)」と、「データがゼロへ変化する部分(測定の終わり)」をそれぞれ選択しています。このコードでは温度や流量を区別しておらず、またデータのインデックスを0.1秒として計算しました。お使いのデータではどのようにプログラムを作れば良いか考えてみてください。 data = [zeros(1,50) ... % 基本数値の0が続いて、ときたま0以外の正の数値が連続してはいるデータ rand(1,16)+(0:0.2:3) rand(1,200)+3 rand(1,16)+(3:-0.2:0) zeros(1,200) ... rand(1,21)+(0:0.1:2) rand(1,300)+2 rand(1,21)+(2:-0.1:0) zeros(1,150) ... rand(1,41)+(0:.025:1) rand(1,250)+1 rand(1,41)+(1:-.025:0) zeros(1,200) ... rand(1,300)+0.3 zeros(1,150)]; tf = ischange(data,'linear'); % データの急激な変化の検出 %% データ測定の開始終了部を抽出 tf2 = [tf zeros(1,4)] & [zeros(1,4) ~data]; % tf2: ゼロからの変化点のみ選択(始まり) tf3 = [zeros(1,4) tf] & [~data zeros(1,4)]; % tf3: ゼロへの変化点のみ選択(終わり) start_idx = find(tf2); end_idx = find(tf3); %% データのプロット plot(data); ylim([0 4.5]); hold on; plot(tf,'*','color','green'); % ischange関数の出力(変化点全て) plot(tf2,'*','color','red'); % tf2: ゼロからの変化点(始まり) plot(tf3,'*','color','blue'); % tf3: ゼロへの変化点(終わり) %% 、目的の範囲の平均値・最大値の演算 col = 'rgbmcyk'; for i=1:size(start_idx,2) ave10_20 = mean(data(start_idx(i)+100:start_idx(i)+200)); % 1流れ出して10秒後から20秒後までの流量の平均値 ave10_ed = mean(data(start_idx(i)+100:end_idx(i))); % 1流れ出して10秒後から最後までの流量の平均値 max0_end = max(data(start_idx(i):end_idx(i))); % 3流量や温度の最大値 yline(ave10_20,'color',col(i)); yline(ave10_ed,'color',col(i)); yline(max0_end,'color',col(i)); end