find '1' in an array

hi ı wanna ask question about find a 1's number in array. for example the array should be like that 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1 and ı only want to find a group of 1's. In array 0 1 0 or 1 0 1 or 0 0 0 1 0 something like that is an error in array. How can we do that. thanks

2 个评论

What is the desired output for the given data? How should these "errors" be treated?
for example the desired output is for 1110101110101111 must be 3. But like 0 1 0 1 0 1 is a wrong.

请先登录,再进行评论。

回答(5 个)

If you mean you want to find the start of the sequences of at least two consecutive 1, then it's simple using diff. You'll find the start of a sequence when the diff with the previous value is 1 (transition from 0 to 1), and you'll know it's followed by a 1 when the diff with the next value is 0, so:
A = [1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1]
startseq1 = find(A & diff([0 A]) == 1 & diff([A 0]) == 0)

4 个评论

ı think this is the better one.
Note that if you want the find the end of the groups and extract them, it's pretty much the same:
A = [1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1];
startseq1 = find(A & diff([0 A]) == 1 & diff([A 0]) == 0); %is 1, preceded by 0, followed by another 1
endseq1 = find(A & diff([A 0]) == -1 & diff([0 A]) == 0); %is 1, followed by 0, preceded by 1
sequences = arrayfun(@(s,e) A(s:e), startseq1, endseq1, 'UniformOutput', false)
but first one startseq1 = find(A & diff([0 A]) == 1 & diff([A 0]) == 0) do not work exactly.
I have no idea what you mean. The code I've written work:
>>A = [1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1];
>>startseq1 = find(A & diff([0 A]) == 1 & diff([A 0]) == 0)
startseq1 =
1 7 13
>>endseq1 = find(A & diff([A 0]) == -1 & diff([0 A]) == 0)
endseq1 =
3 9 16
>>sequences = arrayfun(@(s,e) A(s:e), startseq1, endseq1, 'UniformOutput', false);
>>celldisp(sequences)
sequences{1} =
1 1 1
sequences{2} =
1 1 1
sequences{3} =
1 1 1 1

请先登录,再进行评论。

It is not entirely clear what you want to achieve; if you just want to get rid of the 0's, use
x = [1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1];
y = x(x==1);

1 个评论

no for example in your array [1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1] the number of 1's group should be 3 (1 1 1)(1 1 1)(1 1 1 1) in array (0 1 0 and 0 1 0) is not a group of 1's because ıt is not all of 1's.

请先登录,再进行评论。

[ii,~,~,v] = regexp(sprintf('%d',x(:)'),'1(1+)')
Jan
Jan 2015-10-1
Download and compile: Fex: RunLength . Then:
data = [1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1];
[b, n] = RunLength(data);
result = sum(b == 1 & n > 1);
If the data are small (e.g. just some kB), or you do not have a compiler installed already, use RunLength_M instead from the same submission.
ali
ali 2015-10-2

0 个投票

thanks all for great attention but ı think ı just write something wrong. For example the data 11101111001110001111110100000000011111111 is like that and there only two groups of 1 could be because number of 0 maybe to few then we should accept them as a 1 how can we do that we have to find group as a 2 there.

类别

帮助中心File Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息

标签

提问:

ali
2015-10-1

回答:

ali
2015-10-2

Community Treasure Hunt

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

Start Hunting!

Translated by