查看: 1728|回复: 10|关注: 0

[已解决] Matlab取起始数字大于4,结束连续6个数小于4的,并输出起点

[复制链接]

新手

7 麦片

财富积分


050


3

主题

22

帖子

0

最佳答案
本帖最后由 奔跑的影子 于 2017-12-20 12:00 编辑

如题:一列数取起始数字>=4,中间的数可以小于4(但连续小于4的数不多于6个),一直到连续6个数均小于4结束,并输出起点。
起始应该是  find(data>=4),后面的条件不会了,想了很久,求教一下!谢谢!

MATLAB 基础讨论
版块优秀回答者

3

主题

102

帖子

11

最佳答案
  • 关注者: 5
发表于 2017-12-20 10:46:55 | 显示全部楼层
以后最好给个例子,
我按照我理解的谢了一个简单的,代码如下
  1. data = [1 2 3 4 1 2 5 6 7 8 1 1 1 1 1 1 1]';

  2. star = find(data >= 4);
  3. end1 = find(data < 4);

  4. n = length(end1); %我这么考虑的,连续6个小于4的数,那么应该是连续6个end1的值,六个分一组
  5. end2=[];
  6. for i=1:n-5
  7.     if end1(i+5)-end1(i) == 5
  8.        end2 = [end2;end1(i)]; %连续6个小于4的数,
  9.     end
  10. end

  11. star1 = star(find(star < end2(1)));
  12. n = length(star1);
  13. star2=[];
  14. for i=n:-1:2
  15.     if star1(i)-star1(i-1) ~= 1
  16.         star2=[star2;star(i)];
  17.     end
  18. end
  19. if ~isempty(star2)
  20.     disp(['起点位置为: ' num2str(star2(end)) ',数值为:' num2str(data(star2(end)))])
  21. end
复制代码


多看帮助文档;
回帖请点击 回复此楼,对方可以收到提醒及时回复;
问题得到解决,请及时采纳。

新手

7 麦片

财富积分


050


3

主题

22

帖子

0

最佳答案
 楼主| 发表于 2017-12-20 11:07:35 | 显示全部楼层
落雷殇雨 发表于 2017-12-20 10:46
以后最好给个例子,
我按照我理解的谢了一个简单的,代码如下

你好,感谢您的回答!我试了下,可如果换个数据,就运行出错了,比如
data=[1 2 3 4 4 5 5 5 4 1 5 1 1 1 1 1 1 1 1 2 5 6 7 8 9 1 1 1 1 1 1 1]
也就是如果有两组的话,就会出错:起点位置为: 11,数值为:5

MATLAB 基础讨论
版块优秀回答者

3

主题

102

帖子

11

最佳答案
  • 关注者: 5
发表于 2017-12-20 11:38:18 | 显示全部楼层
奔跑的影子 发表于 2017-12-20 11:07
你好,感谢您的回答!我试了下,可如果换个数据,就运行出错了,比如
data=[1 2 3 4 4 5 5 5 4 1 5 1 1 1 ...

你的中间位置大于4,中间可以没有数么?
多看帮助文档;
回帖请点击 回复此楼,对方可以收到提醒及时回复;
问题得到解决,请及时采纳。

新手

7 麦片

财富积分


050


3

主题

22

帖子

0

最佳答案
 楼主| 发表于 2017-12-20 11:59:02 | 显示全部楼层
落雷殇雨 发表于 2017-12-20 11:38
你的中间位置大于4,中间可以没有数么?

中间的数可以小于4,只要连续小于4的不多于6个,就不是结束点

MATLAB 基础讨论
版块优秀回答者

3

主题

102

帖子

11

最佳答案
  • 关注者: 5
发表于 2017-12-20 12:30:48 | 显示全部楼层 |此回复为最佳答案
奔跑的影子 发表于 2017-12-20 11:59
中间的数可以小于4,只要连续小于4的不多于6个,就不是结束点

我其实还是不太明白你表达的意思呢
  1. % demo_20171220
  2. % 如题:一列数取起始数字>=4,中间都大于4,一直到连续6个数均小于4结束,并输出起点。

  3. data = [1 2 3 4 4 5 5 5 4 1 5 1 1 1 1 1 1 1 1 2 5 6 7 8 9 1 1 1 1 1 1 1]';

  4. star = find(data >= 4);
  5. end1 = find(data < 4);

  6. n = length(end1); %我这么考虑的,连续6个小于4的数,那么应该是连续6个end1的值,六个分一组
  7. end2=[];
  8. for i=1:n-5
  9.     if end1(i+5)-end1(i) == 5
  10.        end2 = [end2;end1(i)]; %连续6个小于4的数,
  11.     end
  12. end
  13. %% 第一次

  14. star1 = star(find(star < end2(1)));
  15. n = length(star1);
  16. star2=[];
  17. for i=n:-1:2
  18.     if star1(i)-star1(i-1) ~= 1
  19. %         if data(star1(i+1)) >= 4  %如果中间大于4的个数不能为0,删除最前面的 %
  20.             star2=[star2;star(i)];
  21. %         end    %如果中间大于4的个数不能为0,删除最前面的 %
  22.     end
  23. end
  24. if ~isempty(star2)
  25.     disp(['起点位置为: ' num2str(star2(end)) ',数值为:' num2str(data(star2(end)))])
  26. end

  27. %% 后面的循环
  28. N = length(end2);
  29. for j= 2:N
  30. star1 = star(find(star(find(star>end2(j-1),1)-1:end) < end2(j)) + find(star>end2(j-1),1)-2);
  31. n = length(star1);

  32. if n==0
  33.     continue
  34. end

  35. star2=[];
  36. for i=n:-1:2
  37.     if star1(i)-star1(i-1) ~= 1
  38. %         if data(star1(i+1)) >= 4  %如果中间大于4的个数不能为0,删除最前面的 %
  39.             star2=[star2;star(i+find(star>end2(j-1),1)-2)];
  40. %         end    %如果中间大于4的个数不能为0,删除最前面的 %
  41.     end
  42. end
  43. if ~isempty(star2)
  44.     disp(['起点位置为: ' num2str(star2(end)) ',数值为:' num2str(data(star2(end)))])
  45. end
  46. end
复制代码
多看帮助文档;
回帖请点击 回复此楼,对方可以收到提醒及时回复;
问题得到解决,请及时采纳。

MATLAB 基础讨论
版块优秀回答者

3

主题

102

帖子

11

最佳答案
  • 关注者: 5
发表于 2017-12-20 13:44:51 | 显示全部楼层
你这个表述有问题么?
只输出起点,那你可以直接find(data>=4,1)不就是起点吗,还找后面的干嘛
多看帮助文档;
回帖请点击 回复此楼,对方可以收到提醒及时回复;
问题得到解决,请及时采纳。

新手

7 麦片

财富积分


050


3

主题

22

帖子

0

最佳答案
 楼主| 发表于 2017-12-20 16:23:55 | 显示全部楼层
本帖最后由 奔跑的影子 于 2017-12-20 17:47 编辑
落雷殇雨 发表于 2017-12-20 12:30
我其实还是不太明白你表达的意思呢
我再叙述一遍吧,数据为一列降雨数据,目的是为了分割雨场:“以大于4为事件起点,以连续6个数小于4为事件结束”,中间小于4是没问题的,再此求教一下。
还有就是循环那块儿,看的不是很懂,减1减2那里,能否注释下下呢,十分感谢啊,谢谢谢谢!

MATLAB 基础讨论
版块优秀回答者

3

主题

102

帖子

11

最佳答案
  • 关注者: 5
发表于 2017-12-20 21:07:04 | 显示全部楼层
奔跑的影子 发表于 2017-12-20 16:23
我再叙述一遍吧,数据为一列降雨数据,目的是为了分割雨场:“以大于4为事件起点,以连续6个数小于4为事件 ...

减1减2那里是为了找到数据点位置,具体呢,


  1. star1 = star(find(star(find(star>end2(j-1),1)-1:end) < end2(j)) + find(star>end2(j-1),1)-2);
复制代码

这里的减1为了使连续的数据产生梯度变化,后面两个减2是调整数据位置,具体我是用数据试的,不清楚怎么解释

star2=[star2;star(i+find(star>end2(j-1),1)-2)];
多看帮助文档;
回帖请点击 回复此楼,对方可以收到提醒及时回复;
问题得到解决,请及时采纳。

新手

7 麦片

财富积分


050


3

主题

22

帖子

0

最佳答案
 楼主| 发表于 2017-12-21 09:45:28 | 显示全部楼层
落雷殇雨 发表于 2017-12-20 21:07
减1减2那里是为了找到数据点位置,具体呢,

再请教一下,循环里面的N = length(end2);
for j= 2:N
star1 = star(find(star(find(star>end2(j-1),1)-1:end) < end2(j)) + find(star>end2(j-1),1)-2);
n = length(star1);

if n==0
    continue
end

这部分是什么作用啊,想不明白,n不会等于0 吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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