标题:C语言寻找一组数据中的第一第二峰值
只看楼主
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
改变参数为50就找到了,这个早知道了,上图参数为100的3个文件的输出,改为50则0和1不变,2就是这样的,用表格软件做出图像?我只是调试观察到的数据,用表格做出图像是比较形象。
用我博客发出来的以0为界的程序基本是可以找到标准的波形,就是对1文件的波形找不准,改变界限为10没测试过;

新思路程序对任何波形都可以,若再改变参数的话,会发现更多的谷值。如下图是0文件的,不妨改变一下显示的细节看看对?


[此贴子已经被作者于2020-2-13 16:50编辑过]

2020-02-13 16:14
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
以下是引用xianfajushi在2020-2-13 16:14:21的发言:

改变参数为50就找到了,这个早知道了,上图参数为100的3个文件的输出,改为50则0和1不变,2就是这样的,用表格软件做出图像?我只是调试观察到的数据,用表格做出图像是比较形象。

估计楼主更想看到您正确的代码,而非图片和结果

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-13 16:50
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
这么多天,贴主根本就没反应,用博客的程序修改参数看看?!
2020-02-13 16:52
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
回复 23楼 xianfajushi
程序代码:
  
//变成这样的吗?会不会很累?
 int 数重组位最大(int 整数)
{       /*C++任意输入一个整数,再把它的各位数字重新组合一个新的整数,使其值最大*///缘由https://bbs.bccn.net/viewthread.php?tid=499134&pid=2718301&page=1#pid2718301
    int 输入整数 = 整数, 数(0), 输出(0), 取值(0), 比较(0), 暂存(0), 位(0), 序(0), 反向(0);
    bool 控制(true);
    if (输入整数 < 100)输入整数 *= 10;
    if (输入整数 > 1000)输入整数 /= 10;
    //scanf_s("%d", &输入整数);
    do
    {
        比较 = 序 = 0;
        暂存 = 输入整数;
        do
        {
            取值 = 暂存 % 10;
            if (取值 > 比较)/*每次取最大值*/
            {
                比较 = 取值;
                数 = 序;
            }
            ++序;
        } while (暂存 /= 10);
        if (控制) 位 = 反向 = 序;
        输出 += 比较 * pow(10, --位);
        控制 = false;
    } while (输入整数 -= 比较 * pow(10, 数));/*每次减去最大值*/
    //printf_s("%d ", 输出);
    数 = 0; 取值 = 输出;
    do
    {
        数 += (输出 % 10) * pow(10, --反向);
    } while (输出 /= 10);/*反向输出各位数*/
    //printf_s("%d ", 数);
    cout << 取值 << "-" << 数 << "=" << 取值 - 数 << endl;
    return 取值 - 数;
}
  

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-13 17:01
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
不明白你说虾米,https://blog.bccn.net/xianfajushi/66967
以下是引用叶纤在2020-2-13 17:01:28的发言:  

2020-02-13 18:00
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
以下是引用xianfajushi在2020-2-13 18:00:35的发言:

不明白你说虾米,https://blog.bccn.net/xianfajushi/66967

我也替你宣传宣传吧
程序代码:
   void 获取2个谷值()
{
    double 读数据[3000]{0}, 谷值[3]{0};
    char* 文件 = "..\\测试存文件\\data100000.txt";
    文件读取(文件, "r", 读数据, 3000);
    int 序 = 0, 数序1 = 0, 数序2 = 0, 数序3 = 0, 谷口 = 0;

 
    while (序 < 3000)
    {//缘由https://bbs.bccn.net/viewthread.php?tid=499186&page=1&extra=#pid2718585
        if (谷值[0]>读数据[序])
            谷值[0] = 读数据[序], 数序1 = 序;
        ++序;
    }
    printf_s("%f->%d\n", 谷值[0], 数序1);
    序 = 数序1;    while (读数据[--序] < 0); 谷口 = 序; 序 = 0;
    while (序 < 谷口)
    {
        if (谷值[1]>读数据[序])
            谷值[1] = 读数据[序], 数序2 = 序;
        ++序;
    }
    序 = 数序1; while (读数据[++序] < 0);
    while (序 < 3000)
    {
        if (谷值[2]>读数据[序])
            谷值[2] = 读数据[序], 数序3 = 序;
        ++序;
    }
    if (谷值[1]<谷值[2])
        printf_s("%f->%d\n", 谷值[1], 数序2);
    else
        printf_s("%f->%d\n", 谷值[2], 数序3);
}
    

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-13 18:23
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
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
要求顶拐点到底拐点是多少(落差)才算是峰?

[此贴子已经被作者于2020-2-14 08:52编辑过]

2020-02-14 08:50
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
固定地往前后200个数据不妥,有可能漏掉数据,我花费2天时间写了2个程序,一个就是用大概2次遍历思路是往前后找顶,再从前后顶去找谷,我这个程序只要变动顶的值就能找到不同顶的谷了,比如把0改为20即可,可以说程序思路是对了,另一个程序则是一遍历即可自动推断顶底的,可能还要优化一下。
目前2个程序都只是初稿,都需要优化。

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

2020-02-14 10:13



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




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

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