필터 지우기
필터 지우기

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

조회 수: 2 (최근 30일)
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
Image Analyst
Image Analyst 2013년 5월 31일
[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.
Han
Han 2013년 6월 1일
@Image Analyst: You are right, it should be [5 1 3 4 2 6 8 7]'

댓글을 달려면 로그인하십시오.

채택된 답변

Daniel Shub
Daniel Shub 2013년 5월 31일
편집: Daniel Shub 2013년 6월 3일
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
Jan
Jan 2013년 5월 31일
편집: Jan 2013년 5월 31일
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)))
Han
Han 2013년 6월 1일
any(strfind(diff(unique(x)), ones(1, 4))) it is then. Thanks

댓글을 달려면 로그인하십시오.

추가 답변 (4개)

Roger Stafford
Roger Stafford 2013년 5월 31일
편집: Roger Stafford 2013년 6월 1일
It can all be put into one line:
any(diff(find([true;diff(unique(x))~=1;true]))>=5)

Image Analyst
Image Analyst 2013년 5월 31일
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
Daniel Shub
Daniel Shub 2013년 5월 31일
@IA I would be surprised if bwlabel followed by regionprops would win Cody or any type of speed test.
Han
Han 2013년 5월 31일
@Image Analyst Thanks very much for your help. But I do not have image processing toolbox. I heard it's expensive.

댓글을 달려면 로그인하십시오.


Azzi Abdelmalek
Azzi Abdelmalek 2013년 5월 31일
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
Azzi Abdelmalek
Azzi Abdelmalek 2013년 5월 31일
편집: Azzi Abdelmalek 2013년 5월 31일
diff(a) can have several values, 0,-1,1,2,....I have grouped 1 and 0
Daniel Shub
Daniel Shub 2013년 5월 31일
Of course, apparently I am not thinking straight, but a = ones(1, 8) still passes your test.

댓글을 달려면 로그인하십시오.


Azzi Abdelmalek
Azzi Abdelmalek 2013년 5월 31일
편집: Azzi Abdelmalek 2013년 5월 31일
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
  댓글 수: 2
Daniel Shub
Daniel Shub 2013년 5월 31일
This code doesn't work you need: e=[1 , diff(a)];.
Second, it says a = ones(1, 8) is a straight.
Azzi Abdelmalek
Azzi Abdelmalek 2013년 5월 31일
편집: Azzi Abdelmalek 2013년 5월 31일
Yes, Look at edited answer (e' instead of e), and this is working for a=ones(8,1)

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Graphics Object Programming에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by