Find the index range of ones/trues?
17 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Yi-xiao Liu
il 14 Apr 2021
Commentato: Walter Roberson
il 15 Apr 2021
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)?
0 Commenti
Risposta accettata
Walter Roberson
il 14 Apr 2021
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(:)]
2 Commenti
Walter Roberson
il 15 Apr 2021
It isn't documented, but it is a long-standing trick that is very convenient.
Più risposte (1)
SungJun Cho
il 14 Apr 2021
Modificato: SungJun Cho
il 14 Apr 2021
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
0 Commenti
Vedere anche
Categorie
Scopri di più su Resizing and Reshaping Matrices in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!