時系列データから0以​外の塊をとりだして処​理するには

9 views (last 30 days)
Saka Toshi
Saka Toshi on 4 Sep 2021
Answered: Atsushi Ueno on 5 Sep 2021
よろしくお願いいたします。時系列データの例をあげます。
蛇口からの出る水の流量をはかっているデータだと、
時系列データは、基本数値の0が続いて、ときたま0以外の正の数値(流量や温度)が連続してはいってます。
この時系列データから、一回目、二回目、三回目、、、の蛇口からでる流量値を、処理していきたいのです。
たとえば、
①流れ出して10秒後から20秒後まで、または最後までの流量の平均値
②流れ出して10秒後から20秒後まで、または最後までの温度の平均値
③流量や温度の最大値
こういった処理をするには、どうやったら効率的に処理できるでしょうか。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 5 Sep 2021
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)); % ①流れ出して10秒後から20秒後までの流量の平均値
ave10_ed = mean(data(start_idx(i)+100:end_idx(i))); % ①流れ出して10秒後から最後までの流量の平均値
max0_end = max(data(start_idx(i):end_idx(i))); % ③流量や温度の最大値
yline(ave10_20,'Color',col(i));
yline(ave10_ed,'Color',col(i));
yline(max0_end,'Color',col(i));
end

More Answers (0)

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!