查看: 2339|回复: 4|关注: 0

[已解决] 如何获取一组数据里的几个极值点?

[复制链接]

新手

19 麦片

财富积分


050


5

主题

13

帖子

0

最佳答案
本帖最后由 One_M 于 2018-8-3 11:42 编辑

大家好,目前我有两组数据,都在excel里,然后plot成了曲线,现在我只想获取红色箭头标注的凹下去的部分的最小值的坐标,而忽略绿色圈中的极值点,其中绿色圈左右两边曲线上升较快,应该如何操作?
我试过findpeaks函数,MinPeakDistance也设置过,但是感觉效果不好。
snipaste_20180803_102038.jpg
snipaste_20180803_102248.jpg

数据.xlsx

19.36 KB, 下载次数: 11

表中数据1,数据2都有数据

论坛优秀回答者

9

主题

1011

帖子

134

最佳答案
  • 关注者: 31
发表于 2018-8-3 23:37:14 | 显示全部楼层 |此回复为最佳答案
  1. %主函数
  2. clear;clc
  3. data1=xlsread('数据.xlsx','数据1');
  4. data2=xlsread('数据.xlsx','数据2');
  5. find_min(data1,3)%[原始数据,局部最小值个数]
  6. find_min(data2,4)
复制代码

  1. %通用函数:find_min.m
  2. function [ temp ] = find_min(data,k)
  3. % 函数功能:根据均值划分模块,然后将模块从大到小排列,求前k个模块的最小值。

  4. A=int8(data<mean(data));%以平均值,二值化

  5. %错位相减求连零
  6. B=[0 A(1:end-1)];%将A后移一位
  7. addr1=find((A-B)==1);%找到开始位置
  8. addr2=find((A-B)==-1);%找到结束位置

  9. [Y I]=sort(addr2-addr1,'descend');%连通区域从大到小排列

  10. %提取前k个模块的最小值
  11. temp=zeros(k,2);%建立空矩阵
  12. for n=1:k
  13.     [temp(n,1) I2]=min(data(addr1(I(n)):addr2(I(n))));%找到该模块的最小值
  14.     temp(n,2)=I2+addr1(I(n))-1;%找到该模块的最小值的位置。
  15. end
  16. %显示结果
  17. figure
  18. hold on
  19. plot(data);%显示原始数据
  20. plot(repmat(mean(data),length(data),1),'g');%显示均值
  21. plot(temp(:,2),temp(:,1),'r*');%显示局部最小值
  22. end
复制代码

结果图

结果图

新手

10 麦片

财富积分


050


0

主题

3

帖子

0

最佳答案
发表于 2018-8-4 09:53:34 | 显示全部楼层

RE: 如何获取一组数据里的几个极值点?

1) average = 5 平滑数据
2) reverse data, 方便使用findpeaks
3) 设定 Minpeakwidth = 8, 来获取“明显大波峰”

a=xlsread('data1.xlsx', 'sheet2');
%%% [1] calculate the 5, 10, 20 days average
ave_dis = 5;
left_data_points = floor(length(a)/ave_dis)+1;
ave_list = [];
for i = [0:left_data_points-1]
    if ave_dis*(i)<length(a)-ave_dis
        element = floor(sum(a(ave_dis*i+1:ave_dis*(i+1)))/ave_dis);
        ave_list = [ave_list,element];
    else
        disp('this is the second case =====')
        element = floor(sum(a(i*ave_dis:end))/length(a(i*ave_dis:end)));
        ave_list = [ave_list,element];
    end
end
figure(1)
plot(a,'-')
   
ave_list = max(ave_list) -ave_list;
%[pks, locs] = findpeaks(ave_list,'MinPeakDistance',10,'MinPeakHeight',2000)
[pks,locs,widths,proms] = findpeaks(ave_list,'MinPeakWidth',8);
widths
proms
figure(2)
plot(ave_list,'-')
hold on
plot(locs,pks,'ro')




004.jpg
003.jpg

新手

19 麦片

财富积分


050


5

主题

13

帖子

0

最佳答案
 楼主| 发表于 2018-8-8 10:25:38 | 显示全部楼层

您好 我试了下 确实不错 但是需要前提知道其中有多少个极小值个数 就是find_min(data,k),也就是需要知道K的值,有没有方法不需要知道K值就能自动获取呢?

论坛优秀回答者

9

主题

1011

帖子

134

最佳答案
  • 关注者: 31
发表于 2018-8-8 13:04:05 | 显示全部楼层
One_M 发表于 2018-8-8 10:25
您好 我试了下 确实不错 但是需要前提知道其中有多少个极小值个数 就是find_min(data,k),也就是需要知道K ...

也可以啊,只是你给的条件不足,无法判别哪些是你需要的极值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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