查找峰值点,求相关

来源:互联网 发布:淘宝上下架规则 编辑:程序博客网 时间:2024/06/04 19:46
#ifndef ALGZKH#define ALGZKH#include <vector>#include <algorithm>#include <numeric>#include <math.h>#include <assert.h>#include <exception>using namespace std;/*using std::vector;using std::max_element;using std::adjacent_difference;*//* *//*∑XY -(∑X∑Y)/N + Init*//*已应用于相关性函数CalculateCorrelationCoefficient*//**/template <class InputIter, class T>T ZKCalculateAssistan_1(InputIter VDataABegin, InputIter VDataAEnd,InputIter VDataBBegin,InputIter VDataBEnd, int N, T Init){   T PartI = inner_product(VDataABegin,VDataAEnd,VDataBBegin,0);   //模板函数 :求内积   T PartII = (T)(accumulate(VDataABegin,VDataAEnd,0)*accumulate(VDataBBegin,VDataBEnd,0)) / N;   return PartI - PartII + Init;}/*********************************************************//*查找数组最大值,寻找第二峰值点                         *//*     T* Data : 数组指针,                              *//*     int length:数组长度                              *//*     T* max_value:输出最大值                          *//*     T Gate: 第二上峰值 门限                          *//*     返回 int:0 第二上峰值<Gate   1 第二上峰值>Gate   *//*********************************************************/template <class T>int ZKFindPeekFloat(T* Data, int length, T Gate, T* max_value){    assert(length!=0);    int flag = 0;    vector<T> VData(Data, Data+length);     //值给容器        vector<T> diffs(length);    vector<T>::iterator vdata_iter= VData.begin();    vector<T>::iterator Iter_Max = max_element(VData.begin(),VData.end());      //最大值    *max_value = *Iter_Max;    //1.虑波    //2.相邻相减    adjacent_difference(VData.begin(),VData.end(),diffs.begin());    vector<T>::iterator diffs_iter = diffs.begin();    diffs_iter++;  //从第二个元素开始    if(*(diffs_iter)>=0)   //+    {       flag = 1;    }    else              //-    {       flag = 0;    }    vector<T>::iterator IterTest;    //3.找极值,拐点    for(int i=1; diffs_iter!=diffs.end(); ++diffs_iter,++i)    {       if(flag==1)       //+       {          if(*diffs_iter>=0)          {             flag = 1;          }          else            //拐点          {             if(*(vdata_iter+i-1)>=Gate)             {                if(*(vdata_iter+i-1)!=*Iter_Max)//不是最大值                {                   IterTest = vdata_iter+i-1;                   *IterTest = *IterTest;                   return 1;                    //上峰值                }             }             flag = 0;          }       }       else if(flag==0)  //-       {           if(*diffs_iter>=0)//拐点          {             if(*(vdata_iter+i)>Gate)             {                 if(*(vdata_iter+i-1)!=*Iter_Max)                 {                    IterTest = vdata_iter+i-1;                    *IterTest = *IterTest;                    //return 1;   //下峰值                 }             }             flag = 1;          }          else          {             flag = 0;          }       }    }    return 0;}/************************************//*两个序列的相关性系数计算          *//*结果建议最多保留小数点后两位      *//*如序列值相同,除数为0,抛出异常runtime_error*//*返回值和Correlation都为输出的结果*//************************************/template <class InputIter, class T>T ZKCalculateCorrelationCoefficient(InputIter VDataABegin, InputIter VDataAEnd, InputIter VDataBBegin,InputIter VDataBEnd, int N, T *Correlation){   // vector<T> VDataA(DataA,DataA+length);   // vector<T> VDataB(DataB,DataB+length);    *Correlation = 1;    T Part_1 = ZKCalculateAssistan_1( VDataABegin,  VDataAEnd, VDataBBegin, VDataBEnd, N, (T)0.0);    T Part_2 = ZKCalculateAssistan_1( VDataABegin,  VDataAEnd, VDataABegin, VDataAEnd, N, (T)0.0);    T Part_3 = ZKCalculateAssistan_1( VDataBBegin,  VDataBEnd, VDataBBegin, VDataBEnd, N, (T)0.0);    //assert(Part_3!=0&&Part_2!=0);    if(Part_2==0||Part_3==0)    {       throw runtime_error("Part_2 or Part_3 is zero");    }    T Part_4 = sqrt(Part_2*Part_3);    assert(Part_4!=0);    T Part_5 = Part_1/Part_4;    return  *Correlation = Part_5;}#endif

原创粉丝点击