二値の配列の中で、同​じ値が任意の点数分、​連続する位置を検出す​るにはどうすればいい​ですか?

15 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2021 年 9 月 28 日
回答済み: Atsushi Ueno 2021 年 9 月 28 日
0,1のみからなる1×n の行列 x に対して、0から1へ変化した後、1が100個以上続くような点を計算するにはどうすればよいか、教えてください。

採用された回答

MathWorks Support Team
MathWorks Support Team 2021 年 9 月 28 日
Signal Processing Toolbox の pulsewidth 関数を用いることで計算できます。
 
以下に例を示します。ここでは、1が 5点以上続くインデックスを検出しています。
入力信号を[x 0]としているのは、xの最後の要素が1の場合、最後に立ち下げておかないとパルスと判定されないためです。
>> rng(1) % reproducibility
% サンプル信号の作成
>> x = rand(1,20)<0.5
x =
1×20 logical 配列
1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1
>> [W,INITCROSS] = pulsewidth([x 0]); %パルス幅を計算
>> ind = ceil(INITCROSS(W>=5)) % 5点以上続くインデックスの開始位置を算出
ind =
3

その他の回答 (1 件)

Atsushi Ueno
Atsushi Ueno 2021 年 9 月 28 日
予め1が100個続く1×100の行列 y を用意しておいて、1×n の行列 x に対する畳み込みの結果を得る事で、1が100個以上続くような点が判ります。(100個は長過ぎるので、例として上記回答と同じ5個にしました)
x = [1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1]
x = 1×20
1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1
y = ones(1, 5)
y = 1×5
1 1 1 1 1
z = conv(x, y)
z = 1×24
1 1 2 3 4 4 5 5 5 4 4 3 3 2 3 2 3 2 3 3 3 2 2 1
end_idx = find(z>=5) % 7番目、8番目、9番目の時点で1が5点以上続いている
end_idx = 1×3
7 8 9
start_idx = end_idx - (5 - 1) % 長さ-1を減算し開始位置のインデックスにする
start_idx = 1×3
3 4 5

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

製品


リリース

R2020a

Community Treasure Hunt

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

Start Hunting!