Find the index range of ones/trues?

17 ビュー (過去 30 日間)
Yi-xiao Liu
Yi-xiao Liu 2021 年 4 月 14 日
コメント済み: Walter Roberson 2021 年 4 月 15 日
For example, given a logical vector:
[0,0,1,0,0,1,1,0,1,1,1,0,0...]
I need a two-column matrix:
[3,3;
6,7;
9,11;...]
that register the start and end index of each "1 blocks". Is there any convenient way to do that (ideally vectorized)?

採用された回答

Walter Roberson
Walter Roberson 2021 年 4 月 14 日
test_vector = [0,0,1,0,0,1,1,0,1,1,1,0,1,1,1,1];
starts = strfind([0 test_vector], [0 1]);
stops = strfind([test_vector 0], [1 0]);
out = [starts(:), stops(:)]
out = 4×2
3 3 6 7 9 11 13 16
  2 件のコメント
Yi-xiao Liu
Yi-xiao Liu 2021 年 4 月 14 日
Brilliant, I didn't know strfind operates on numerical arrays
Walter Roberson
Walter Roberson 2021 年 4 月 15 日
It isn't documented, but it is a long-standing trick that is very convenient.

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

その他の回答 (1 件)

SungJun Cho
SungJun Cho 2021 年 4 月 14 日
編集済み: SungJun Cho 2021 年 4 月 14 日
I made a brief function that gives you a two-column matrix of the start and end indices when a logical vector is given as an input. I used the iteration method here, but I am pretty sure there is a recursion method to solve this problem. Hope this helps.
test_vector = [0,0,1,0,0,1,1,0,1,1,1,0,1,1,1,1];
output = get_true(test_vector);
function [output] = get_true(test_vector)
test_array = find(test_vector == 1);
test_idx = zeros(length(test_array)-1,2);
for ii = 1:length(test_array)
if ii == length(test_array)
break;
end
test_idx(ii,1) = test_array(ii);
test_idx(ii,2) = test_array(ii+1);
end
output = zeros(length(test_idx),2);
for idx = 1:length(test_idx)
idx_start = test_idx(idx,1);
idx_end = test_idx(idx,2);
if idx_start+1 < idx_end
output(idx,1) = idx_start;
output(idx,2) = idx_end;
end
end
output = sort(output(output~=0));
output = vertcat(test_array(1), output, test_array(end));
output = reshape(output,2,length(output)/2)';
end
Best,
SungJun

カテゴリ

Help Center および File ExchangeGeometric Transformation and Image Registration についてさらに検索

タグ

製品


リリース

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by