MATLAB Answers

閾値検出後データ取得

10 ビュー (過去 30 日間)
洋生 福光
洋生 福光 2021 年 4 月 28 日
回答済み: Hernia Baby 2021 年 4 月 28 日
閾値を作成し閾値後のデータを取得する処理の方法をご教授願います。
どの様に処理をしたいかといいますと、例えば
[1, 2, 1, 0, 3, 2, 8, 2, 1, 0, 3, 6, 7, 1, 0, 3 ]
というデータがあったときに閾値5を設定して、閾値後3つデータを取得するプログラム
[1, 2, 1, 0, 3, 2, 8, 2, 1, 0, 3, 6, 7, 1, 0, 3 ]
a=[8,2,1] b=[6,7,1]
という風なプログラムを作成したいです。
何か良い方法はないでしょうか?
お手数おかけしますが、どうかお願いします。

採用された回答

Hernia Baby
Hernia Baby 2021 年 4 月 28 日
for文を使わない方法でやってみました
わかりやすくするためにA1,A2,A3といった文章にしています
clear,clc,close all;
A = [1, 2, 1, 0, 3, 2, 8, 2, 1, 0, 3, 6, 7, 1, 0, 3 ];
% A = [6, 1, 7, 4, 8, 9, 1, 2, 1, 0, 3, 2, 8, 2, 1, 0];
t = 5;
idx = A >= t;
idx_shift = [0, idx(1:end-1)];
% 閾値を超えた最初の行のみ抽出
idx_trig = idx.*xor(idx,idx_shift) == 1;
% 1こずつ右にシフト
idx_trig_shift1 = [0, idx_trig(1:end-1)] == 1;
idx_trig_shift2 = [0, idx_trig_shift1(1:end-1)] == 1;
% 対応する数字を出す
A1 = A(idx_trig);
A2 = A(idx_trig_shift1);
A3 = A(idx_trig_shift2);
if length(A1) > length(A2)
% 端部が閾値over
A2(end+1) = nan;
A3(end+1) = nan;
elseif length(A2) > length(A3)
% 端部から1つ前が閾値over
A3(end+1) = nan;
end
Ans = [A1; A2; A3]'
Ans =
8 2 1
6 7 1
-----------------------
logical値については以下をどうぞ

その他の回答 (1 件)

Hiroyuki Hishida
Hiroyuki Hishida 2021 年 4 月 28 日
福光様、
このようなイメージでしょうか?
処理関数が不明であっても、言葉を変えて検索してみると、似た処理を行っているサンプルが見つかるかもしれません。
x=[1, 2, 1, 0, 3, 2, 8, 2, 1, 0, 3, 6, 7, 1, 0, 3 ];
t=5;
%Googleで、"matlab 条件 要素"で検索してみてください
idx=find(x>t);
C=cell(length(idx));
for i=1:length(idx)
%3つ確保できるとき
if idx(i)+2 <= length(x)
C{i}=[ x(idx(i)), x(idx(i)+1), x(idx(i)+2)];
disp(C{i});
%端部に近く、2つだけ確保できるとき
elseif idx(i)+1 <= length(x)
C{i}=[ x(idx(i)), x(idx(i)+1), NaN];
disp(C{i});
%端部で、1つだけ確保できるとき
else
C{i}=[ x(idx(i)), NaN, NaN];
disp(C{i});
end
end
菱田
  1 件のコメント
洋生 福光
洋生 福光 2021 年 4 月 28 日
菱田様
ご返信ありがとうございます。予想通りの処理ができております。調べ方を工夫しながら進めていきたいと思います。ご教授ありがとうございます。
福光

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!