标题:C语言寻找一组数据中的第一第二峰值
取消只看楼主
zzmx
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2020-2-4
结帖率:75%
已结贴  问题点数:15 回复次数:7 
C语言寻找一组数据中的第一第二峰值
实验要求,我需要找出一组数组中的两个峰值:第一个峰值和第二个峰值及其数组下标。这组数据画出的图应该是这样的,我就要找出图中的那两个峰值

我写的程序如下,我试了一下,这样找出的数据是不对的。比如有的数据会找出这样的数(隔得太近了,肯定不是)
有的会找出这样的数

所以,请问有没有办法找出这样的两个峰值。
程序代码:
#include <iostream>
int main(int argc, char** argv)
 {
     double a[3000];
     double peak1,peak2,min=a[0];
     int i,p1,p2,t1,t2,life;
     FILE *fp=NULL;
     FILE *fpp=NULL;
     fp=fopen("G:\\uz\\new\\data100578.txt","r");
     for(i=0;i<2500;i++)
     {
         fscanf(fp,"%lf",&a[i]);
     }
     for(i=1;i<2500;i++)
     {
         if(a[i]<min)
         {
         min=a[i];
        peak1=a[i];
         p1=i+1;    
         }
     }//找第一个峰值 
     
     for(i=p1,min=a[p1];i<2500;i++)
     {
         if(a[i]<min)
         {
         min=a[i];
         peak2=a[i];
         p2=i+1;    
         }
     }//找第二个峰值
     printf("%lf %d\n",peak1,p1);
    printf("%lf %d\n",peak2,p2);
     fclose(fp);
    return 0;
}

附几组数据
data.zip (7.63 KB)


[此贴子已经被作者于2020-2-11 12:19编辑过]

搜索更多相关主题的帖子: C语言 峰值 数据 min int min C语言 数据 int 峰值 
2020-02-11 12:14
zzmx
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2020-2-4
得分:0 
谢谢你们的回复。这些数据本身就很复杂,确实存在有多个峰值的可能,我要做的就是找出第一二大峰值,是处理数据最关键的一步。明天我会上线找各位请教!谢谢你们!
2020-02-14 00:08
zzmx
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2020-2-4
得分:0 
这是我不成熟的暂时作为寻峰的代码,偶然性较大。还请大神指教新法。我的思路:第一个循环:找最大值 。第二个循环:从这个最大值后面第200个数开始往后找,再找一个最大值 。第三个循环:从这个最大值前面第200个数开始往前找,再找一个最大值。   最后判断一下:确定第二个峰,但是判断的方法不好确定(一种思路是拿阈值卡,一种思路是比较他们两个的大小,但是这都不是绝对的,万无一失的,因为很多组(1000多)数据的变化是很多样的。总之,这种方法的偶然性较大(全看这个波形是怎么变的),所以不大成熟
程序代码:
#include <iostream>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv)

 {
     double a[3000];
     double peak1,peak2,peak3,min=a[0];
     int i,p1,p2,p3,b,life;
     char filename[1000]={0};
     FILE *fp=NULL;
     FILE *fpp=NULL;
     for(b=100000;b<100854;b++)
     {
         sprintf(filename,"F:\\uz\\new\\data%d.txt",b);
         fp=fopen(filename,"r");
     
     for(i=0;i<2500;i++)
     {
         fscanf(fp,"%lf",&a[i]);
     }
     for(i=1;i<2500;i++)
     {
         if(min>a[i])
         {
         min=a[i];
        peak1=a[i];
         p1=i+1;    
         }
     }//找最小值
     
     for(i=p1+300,min=a[p1+300];i<2500;i++)
     {
         if(min>a[i])
         {
         min=a[i];
        peak2=a[i];
         p2=i+1;    
         }
     }//找第二个峰值 
     for(i=p1-300,min=a[p1-300];i>0;i--)
     {
         if(min>a[i])
         {
         min=a[i];
        peak3=a[i];
         p3=i+1;    
         }
     }//找第三个峰值 
    /* printf("%lf  %d\n",peak1,p1);
     printf("%lf  %d\n",peak2,p2);
     printf("%lf  %d\n",peak3,p3);*/
     
     if(peak2>peak3)
     {
     life=abs(p2-p1);    
     //printf("%d\n",life);    
     }
     else
     {
     life=abs(p2-p1);    
         
     //printf("%d\n",life);    
     }
     fpp=fopen("F:\\uz\\life1.txt","a");
     if(fpp==NULL)
     {
         printf("wrong");
     }
     fprintf(fpp,"%d\n",life);
     fclose(fp);
     fclose(fpp);
   }
    return 0;
}

   
2020-02-14 00:23
zzmx
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2020-2-4
得分:0 
回复 30楼 xianfajushi
你好,我想知道你写的程序结果如何?具体代码是怎么样的?
2020-02-14 13:17
zzmx
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2020-2-4
得分:0 
回复 11楼 xianfajushi
确实会有2文件这种情况,所以在处理数据时,这种波形是需要丢掉的,但是不知道代码怎么实现
2020-02-14 13:19
zzmx
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2020-2-4
得分:0 
回复 11楼 xianfajushi
确实会有这种情况,那这组数据就需要丢掉,但是编程不知道怎么鉴别出这些错误的情况,怎么舍去
2020-02-14 13:21
zzmx
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2020-2-4
得分:0 
回复 29楼 吹水佬
什么意思?我要找的是两个峰值
2020-02-14 13:23
zzmx
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2020-2-4
得分:0 
回复 35楼 xianfajushi
是呀!想看你的代码
2020-02-14 14:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499186-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.555258 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved