Detect parts of a 0/1 (binary) vector consisting of only 0 or 1

2 ビュー (過去 30 日間)
Ilya
Ilya 2014 年 4 月 3 日
編集済み: Ilya 2014 年 4 月 6 日
Let's say I have a vector of 0 and 1:
a=[1 1 1 0 0 0 1 0 1 0 0 1 1 0];
It's needed to find a way to extract the vector's indices so that each group of extracted indices contains a part of a vector consisting of only zeros or only ones. For the given example it should be like:
[1 3] [4 6] [7] [8] [9] [10 11] [12 13] [14]
I thought about diff(), but some post-processing is definitely required after it...

採用された回答

Sean de Wolski
Sean de Wolski 2014 年 4 月 3 日
idx = find(diff([~a(1) a]))';
pcs = spdiags(rot90([idx-1 idx]));
pcs(end) = numel(a)
  3 件のコメント
Image Analyst
Image Analyst 2014 年 4 月 3 日
Wow - never would have guessed that.
Ilya
Ilya 2014 年 4 月 6 日
編集済み: Ilya 2014 年 4 月 6 日
A more robust solution (the same idea):
idx1 = find(diff([~a(1) a]));
idx2 = circshift(idx1-1,[0 -1]);
idx2(end) = numel(a);
pcs = [idx1; idx2];
The initial one may be wrong i.e. in case a=[1 1 1 1 0], due to the unpredictable spdiags() behavior.

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

その他の回答 (1 件)

Image Analyst
Image Analyst 2014 年 4 月 3 日
If you have the Image Processing Toolbox, the 1's are given by the PixelIdxList property. You can do it in one line with a call to regionprops:
a=[1 1 1 0 0 0 1 0 1 0 0 1 1 0];
% Find 1's.
locations = regionprops(logical(a), 'PixelIdxList');
% Print out to command line:
for k = 1 : length(locations)
locations(k).PixelIdxList
end
% Find 0's.
locations = regionprops(logical(~a), 'PixelIdxList');
% Print out to command line:
for k = 1 : length(locations)
locations(k).PixelIdxList
end
  1 件のコメント
Salaheddin Hosseinzadeh
Salaheddin Hosseinzadeh 2014 年 4 月 3 日
Interesting to see such different perspective!

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

Community Treasure Hunt

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

Start Hunting!

Translated by