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

Categories

Find more on Graphics Object Programming in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!