整流化されたデータか​ら任意の閾値以下かつ​100以上連続するデ​ータの抽出方法を知り​たいです

20 views (last 30 days)
和希 吉川
和希 吉川 on 2 May 2022
Edited: Hernia Baby on 15 Jul 2022
イメージはこの図におけるT1です。このT1はThreshold以下で連続する100個以上のデータです。特に”連続する100個以上のデータ”の部分について詳しく知りたいです。

Answers (1)

Hernia Baby
Hernia Baby on 2 May 2022
まずはサンプルを作ります
t = 0:1/1e3:8;
x = sin(t+5).^3+cos(2*pi*(t+5))+3;
threshold = 3.95;
n = 200;
一度図示していきましょう
figure
hold on
plot(t,x,'Color',[.4 .4 .4])
yline(threshold,'--r')
hold off
今回は、上図の閾値以上でn=200より連続点が大きい部分を抜き出します
こちら を参考にして正負ともにカウントしていきます
そのあと差分をとり、カウントがリセットされるまでの場所を探します
idx = x >= threshold;
cells = cell2mat(arrayfun(@(t)1:t,diff(find([1 diff(idx) 1])),'un',0)).*idx;
idx1 = find([diff(cells) 0] < 0)
idx1 = 1×4
1044 2170 3228 4069
ここで n = 200点より多い配列を抽出します
idx1 = idx1(cells(idx1) > n);
num = cells(idx1)
num = 1×2
281 483
for ii = 1:length(idx1)
start = idx1(ii)-num(ii)+1;
fin = idx1(ii);
T{ii} = t(start:fin);
X{ii} = x(start:fin);
end
さて後はXを見ればいいのですがせっかくなので、図示してみましょう
figure
hold on
plot(t,x,'Color',[.4 .4 .4])
yline(threshold,'--r')
cellfun(@(t,x) plot(t,x), T,X)
hold off
  2 Comments
和希 吉川
和希 吉川 on 14 Jul 2022
Edited: 和希 吉川 on 14 Jul 2022
丁寧な回答ありがとうございます。
算出したいデータがthreshold以下であったため、以下のように書き換えて自らのデータにあてはめました。
idx = x <= threshold;
cells = cell2mat(arrayfun(@(t)1:t,diff(find([1 diff(idx) 1])),'un',0)).*idx;
idx1 = find([diff(cells) 0] < 0)
idx1 = idx1(cells(idx1) > n);
num = cells(idx1)
for ii = 1:length(idx1)
start = idx1(ii)-num(ii)+1;
fin = idx1(ii);
T{ii} = t(start:fin);
X{ii} = x(start:fin);
end
すると、オレンジ、黄色の部分は算出されたのですが、右端のグレーの部分がXとして出てきませんでした。このグレーの部分も算出するためにはどうすればよいのか、教えていただけると幸いです。
Hernia Baby
Hernia Baby on 15 Jul 2022
Edited: Hernia Baby on 15 Jul 2022
最後の点を認識しないようにしているからです
データ量は増えますが、以下のようにするとうまくいくと思います
clear,clc,close all;
t = 0:1/1e3:8;
x = sin(t+5).^3+cos(2*pi*(t+5))+3;
threshold = 3;
n = 200;
figure
hold on
plot(t,x,'Color',[.4 .4 .4])
yline(threshold,'--r')
hold off
以下の部分を書き換えました
idx = x > threshold;
cells = cell2mat(arrayfun(@(t)1:t,diff(find([1 diff(idx) 1])),'un',0)).*idx;
idx1 = find([diff(cells) 0] <= 0); %ここ
後は同じです
idx1 = idx1(cells(idx1) > n);
num = cells(idx1)
num = 1×7
481 636 790 547 440 441 251
for ii = 1:length(idx1)
start = idx1(ii)-num(ii)+1;
fin = idx1(ii);
T{ii} = t(start:fin);
X{ii} = x(start:fin);
end
figure
hold on
plot(t,x,'Color',[.4 .4 .4])
yline(threshold,'--r')
cellfun(@(t,x) plot(t,x), T,X)
hold off

Sign in to comment.

Categories

Find more on シミュレーション条件の構成 in Help Center and File Exchange

Products


Release

R2021a

Community Treasure Hunt

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

Start Hunting!