閾値検出後データ取得

조회 수: 3 (최근 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일
菱田様
ご返信ありがとうございます。予想通りの処理ができております。調べ方を工夫しながら進めていきたいと思います。ご教授ありがとうございます。
福光

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Data Acquisition Toolbox Supported Hardware에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!