How to tell if there are at least 5 consecutive entries in one 8-by-1 matrix with 8 integers?

1 view (last 30 days)
Hi:
I am looking for a way to determine if there are AT LEAST 5 consecutive values in one 8-by-1 matrix with 8 integers. The 8 integers do NOT have to be unique. And I prefer this to be short and loop-free.
The consecutive values have to be in a "straight", meaning that [5 1 3 4 2 6 8 7] would work because it has at least 5 (actually 8) consecutive values in a straight. The straight is 1 2 3 4 5 6 7 8.
But [1 2 3 4 10 9 8 7] would not because it only has 4 values in each of the straight. The first straight is 1 2 3 4. The second straight is 7 8 9 10.
Thank you very much for your help (I'm writing this for my TexasHoldEm function for fun)
  10 Comments
Image Analyst
Image Analyst on 31 May 2013
[5 1 3 4 2 6 8 7] is 1 by 8, not 8 by 1 like you said, and my code assumes. Which is it??? [5; 1; 3; 4; 2; 6; 8; 7] would be 8 by 1.

Sign in to comment.

Accepted Answer

Daniel Shub
Daniel Shub on 31 May 2013
Edited: Daniel Shub on 3 Jun 2013
As people are giving answers, I am pretty confident that
not(isempty(strfind(diff(sort(unique(x))), ones(1, 4))))
works. I am less confident that
not(all(diff(sort(unique(x)), 4)))
works, but if it does, it is much cooler as I rarely use the second argument to diff. After further thinking the second approach does not work. It fails in all sorts of unique ways, for example 1,3,5,7,9.
  3 Comments
Jan
Jan on 31 May 2013
Edited: Jan on 31 May 2013
You can replace not(isempty(strfind())) by any(strfind())
And the output of unique is still sorted. Then your first method becomes:
any(strfind(diff(unique(x)), ones(1, 4)))

Sign in to comment.

More Answers (4)

Roger Stafford
Roger Stafford on 31 May 2013
Edited: Roger Stafford on 1 Jun 2013
It can all be put into one line:
any(diff(find([true;diff(unique(x))~=1;true]))>=5)

Image Analyst
Image Analyst on 31 May 2013
How about
data = [9; 1; 2; 3; 4; 5; 6; 9] % Sample data.
diffData = diff(data)
countOf1s = sum(diffData==1)+1
atLeast5 = countOf1s >= 5
  7 Comments
Daniel Shub
Daniel Shub on 31 May 2013
@IA I would be surprised if bwlabel followed by regionprops would win Cody or any type of speed test.
Han
Han on 31 May 2013
@Image Analyst Thanks very much for your help. But I do not have image processing toolbox. I heard it's expensive.

Sign in to comment.


Azzi Abdelmalek
Azzi Abdelmalek on 31 May 2013
a=[3 2 3 4 5 5 7 6 8];
e=[1 diff(a)];
e(e==0)=1;
idx=strfind(e,[true,true,true,true]) % it exist if idx~=0
  4 Comments

Sign in to comment.


Azzi Abdelmalek
Azzi Abdelmalek on 31 May 2013
Edited: Azzi Abdelmalek on 31 May 2013
a=[1; 2; 3; 5; 6; 7; 9; 10]
a=sort(a)
e=[1 ;diff(a)];
e(e==0)=1;
idx=~isempty(strfind(e',[true,true,true,true])) % it exist if idx=1

Community Treasure Hunt

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

Start Hunting!