查找峰值点,求相关
来源:互联网 发布:淘宝上下架规则 编辑:程序博客网 时间: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