本帖最后由 winner245 于 2014-10-31 04:05 编辑
刚才我在 5L、6L 考虑的是任意连续数字情形,并没有规定连续数字的个数 >= 3,只是找出连续的数值(这是MATLAB中文论坛最近另一个帖子的问题:http://ilovematlab.cn/thread-308583-1-1.html )。
如果加上连续元素个数 >= 3 的限制,我还是先一如既往 diff 到底(对5L、6L代码修改如下):
1. 连续0元素计入在内:
- m = [1,0,0,1,1,1,1,0,2,2,2,0,0,0,2345,2345,2345,2345,2345]
- k = reshape(find(diff([0 ~diff(m) 0])),2,[]);
- k = k(:,diff(k)>=2)
- m(k(1,:))
复制代码
k =
4 9 12 15
7 11 14 19
ans =
1 2 0 2345
2. 仅考虑非0连续元素:
- m = [1,0,0,1,1,1,1,0,2,2,2,0,0,0,2345,2345,2345,2345,2345];
- k = reshape(find(diff([0 ~diff(m) 0])),2,[]);
- k = k(:,diff(k)>=2 & m(k(1,:))~=0)
- m(k(1,:))
复制代码
k =
4 9 15
7 11 19
ans =
1 2 2345
受两位版主启发,可以将 diff 和 regexp 结合使用
1. 连续0元素计入在内:
- m = [1,0,0,1,1,1,1,0,2,2,2,0,0,0,2345,2345,2345,2345,2345];
- [c,d] = regexp(sprintf('%d', ~diff(m)), '1{2,}');
- [c;d+1]
- m(c)
复制代码
ans =
4 9 12 15
7 11 14 19
ans =
1 2 0 2345
2. 仅考虑非0连续元素:
- m = [1,0,0,1,1,1,1,0,2,2,2,0,0,0,2345,2345,2345,2345,2345];
- [c,d] = regexp(sprintf('%d', ~diff(m)), '1{2,}');
- id = m(c)~=0;
- [c(id);d(id)+1]
- m(c(id))
复制代码
ans =
4 9 15
7 11 19
ans =
1 2 2345 |