find '1' in an array

16 次查看(过去 30 天)
ali
ali 2015-10-1
回答: ali 2015-10-2
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 个评论
Jan
Jan 2015-10-1
What is the desired output for the given data? How should these "errors" be treated?
ali
ali 2015-10-1
for example the desired output is for 1110101110101111 must be 3. But like 0 1 0 1 0 1 is a wrong.

请先登录,再进行评论。

回答(5 个)

Guillaume
Guillaume 2015-10-1
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 个评论
ali
ali 2015-10-1
but first one startseq1 = find(A & diff([0 A]) == 1 & diff([A 0]) == 0) do not work exactly.
Guillaume
Guillaume 2015-10-1
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

请先登录,再进行评论。


Thorsten
Thorsten 2015-10-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 个评论
ali
ali 2015-10-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.

请先登录,再进行评论。


Andrei Bobrov
Andrei Bobrov 2015-10-1
[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
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.

类别

Help CenterFile Exchange 中查找有关 Arithmetic Operations 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by