设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1800|回复: 0

matlab-统计向量中连续出现的数字并计数

[复制链接]

30

主题

284

金钱

420

积分

入门用户

发表于 2019-8-14 15:20:44 | 显示全部楼层 |阅读模式

例如对于一个行向量 [0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1],我想要统计其中连续1的位置以及连续出现的次数,有下面两种方法:

1. 利用 diff 函数
  1. diff: 求前后两项之差,diff(X)= [X(2)-X(1),X(3)-X(2),...,X(n)-X(n-1)]。

  2. A = [0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1];
  3. k = diff([0 A 0])           %对A前后补0之后再使用diff,补0是为了保证对于A的第一个和最后一个元素是1的情况,也能够通过diff求得1或-1,然后再根据1和-1来寻找连续1的位置和个数
  4. ind = find(k==1)            %1出现的位置即连续1出现的位置
  5. num = find(k==-1)-ind       %-1和1出现的位置差即连续1出现的个数
复制代码

其中 ind 是出现连续1的首尾的索引,num 是该连续1出现的个数。这里 ind = [4 8 12 18], num = [3 2 3 1],也就是说 A 向量中4这个位置开始出现连续1,连续出现3次。同理8位置开始出现连续1,连续出现2次。

2. 转换成字符串之后用正则表达式进行匹配
  1. A = [0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1];
  2. Ach = num2str(A); Ach(Ach==' ') = [];            %将A转换为字符串
  3. [ind,indEnd] = regexp(Ach,'1*','start','end');    %匹配字符串连续1的位置
  4. num = indEnd-ind+1;
复制代码

很多这种统计向量中数的问题都可以转化为检测连续1出现次数,例如统计向量A中连续数字出现的位置和次数,A = [21,23,25,27,28,29,30,31,33,35,36,38,47,55], 那么进行一次转换:k = diff(A)==1,就可以得到 k  =  [0 0 0 1 1 1 1 0 0 1 0 0 0],其中 k 中连续1出现的位置是 A 中连续数字出现的位置,k中连续1出现的次数加1就是 A 中连续数字出现的次数。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表