核心寻峰算法的原理参考Ronny,链接:投影曲线的波峰查找,

C#翻译原理代码参考sowhat4999,链接:C#翻译Matlab中findpeaks方法

前人种树,后人乘凉。感谢原作者详细的解释说明。

这里先把翻译代码贴一下(略微的修改了sowhat4999代码中的几个参数)

//调用方法
List<double> data = new List<double>{25, 8, 15, 5, 6, 10, 10, 3, 1, 20, 7};
List<int> index = getPeaksIndex(trendSign(oneDiff(data)));

//第一次寻峰(基本峰距为1)算法
private double[] oneDiff(List<double> data)
{double[] result = new double[data.Count - 1];for (int i = 0; i < result.Length; i++){result[i] = data[i + 1] - data[i];}return result;
}private int[] trendSign(double[] data)
{int[] sign = new int[data.Length];for (int i = 0; i < sign.Length; i++){if (data[i] > 0) sign[i] = 1;else if (data[i] == 0) sign[i] = 0;else sign[i] = -1;}for (int i = sign.Length - 1; i >= 0; i--){if (sign[i] == 0 && i == sign.Length - 1){sign[i] = 1;}else if (sign[i] == 0){if (sign[i + 1] >= 0){sign[i] = 1;}else{sign[i] = -1;}}}return sign;
}private List<int> getPeaksIndex(int[] diff)
{List<int> data = new List<int>();for (int i = 0; i != diff.Length - 1; i++){if (diff[i + 1] - diff[i] == -2){data.Add(i + 1);}}return data;//相当于原数组的下标
}

以上方法并没有将峰距、边锋、峰值情况考虑在内,但已经给与我们后人一个完整的思路。

峰距情况分析:

我们可以将上述方法理解为峰距1的寻峰算法,当我们需要完成峰距为2的寻峰情况时我们需要判断

data[i]是否大于data[i+1],data[i+2],data[i-1],data[i-2]

同理按照此方法完成点数为100000,峰距为1000的寻峰,则需要进行100000的1000次方次运算,这显然需要花费大量的时间进行运算。

优化过程中,我们并不能改变峰距(即幂指数1000),但我们可以改变点数(即底数100000)的大小。从而实现运算量的降低。

以上峰距为1的寻峰方法此时已经完成判断

data[i]是否大于data[i+1],data[i-1]

并返还峰值对应的索引列

峰距为2时,我们只需要再次对索引列中内容进行判断即可(只有在峰距为1的判断中胜出的点,才有可能在峰距为2的判断中胜出)

data[i]是否大于data[i+2],data[i-2]

此时你会发现我们需要遍历的底数已经并不是原点数100000,而是上次返还的寻峰序列个数

            // 调用方法List<double> Xaxis = new List<double> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };List<double> Yaxis = new List<double> { 25, 8, 15, 5, 6, 10, 10, 3, 1, 20, 7 };// 峰距int DisPeak = 3;// 峰距为3时得到的脚标List<int> index = getPeaksIndex(trendSign(oneDiff(Yaxis)));// 已进行的判断int level = 1;// 扩大峰距范围范围算法while (DisPeak > level){level++;List<int> result = DoPeakInstance(Yaxis, index, level);index = null;index = result;}// 获取两侧满足条件的边峰序列index = GetBothSidePeakIndex(Xaxis, Yaxis, 1, index);double minFZ = 10.0;// 根据最小峰值序列进行筛选index = FindMinPeakValue(minFZ, Yaxis, index);

        //扩大寻峰范围算法private List<int> DoPeakInstance(List<double> data, List<int> index, int level){//相当于原数组的下标List<int> result = new List<int>();for (int i = 0; i < index.Count; i++){//判断是否超出下界和上界if (index[i] - level >= 0 && index[i] + level < data.Count){if (data[index[i] + level] <= data[index[i]] && data[index[i] - level] <= data[index[i]]){result.Add(index[i]);}}}return result;}

边锋情况分析:

仔细阅读上述两算法,你会发现该算法存在一个无法避免的问题 如:

峰距是3,此时峰首部点序(点0,点1,点2)因无法向前比较,导致并没有参与到峰值计算中。 尾部点则因无法向后比较没有参与到峰值计算中。

此情况我们首先要清楚,因上述情况未参与比较的点序中,首部最多仅有一个峰值,尾部最多仅有一个峰值。

那我们把它加上就好了,美滋滋。

        //获取两侧满足条件的边峰序列private static List<int> GetBothSidePeakIndex(List<double> Xaxis, List<double> Yaxis, int FJ, List<int> index){//获取数据首尾两侧最大峰值(0,FJ)点序和(Date.CountFJ-FJ,Data.Count)点序int TopIndex = 0;int BottomIndex = Yaxis.Count - 1;for (int i = 0; i < FJ; i++){if (Yaxis[i] >= Yaxis[TopIndex]){TopIndex = i;}if (Yaxis[Yaxis.Count - 1 - i] >= Yaxis[BottomIndex]){BottomIndex = Yaxis.Count - 1 - i;}}//判断是否满足条件检索条件int newTopIndex = TopIndex;int newBottomIndex = BottomIndex;for (int i = 0; i <= FJ; i++){if (Yaxis[TopIndex + i] >= Yaxis[TopIndex]){newTopIndex = TopIndex + i;}if (Yaxis[BottomIndex - i] >= Yaxis[BottomIndex]){newBottomIndex = BottomIndex - i;}}TopIndex = newTopIndex;BottomIndex = newBottomIndex;//添加到结果序列if (TopIndex <= FJ && TopIndex != 0){index.Insert(0, TopIndex);}if (BottomIndex >= BottomIndex - FJ && BottomIndex != Xaxis.Count - 1){index.Add(BottomIndex);}return index;}

最后,也就是最简单的峰值判断了。比一下就好了。

        //根据最小峰值序列进行筛选private static List<int> FindMinPeakValue(double minFZ, List<double> Yaxis, List<int> index){List<int> finalresult = new List<int>();for (int i = 0; i < index.Count; i++){if (Yaxis[index[i]] >= minFZ){finalresult.Add(index[i]);}}index = null;index = finalresult;return index;}

转载于:https://www.cnblogs.com/LemonFive/p/8397511.html

C# 实现寻峰算法的简单优化(包含边峰,最小峰值,峰距)相关推荐

  1. 退火算法解决简单优化问题

    退火算法基本思想在此不再赘述,可参考本文.模板如下: T0 = 1000; % 初始温度 T = T0; % 迭代中温度会发生改变,第一次迭代时温度就是T0 maxgen = 500; % 最大迭代次 ...

  2. C#中读取.mat文件,然后实现寻峰算法

    理论可以看我下面推荐的博客,我直接上代码 private double[] oneDiff(double[] data)//一阶差分{double[] result = new double[data ...

  3. 教学优化算法的简单介绍

    目录 摘要 背景 算法 学生初始化 教学阶段 学习阶段 流程总结 优缺点 优点 缺点 一些改进 总结 参考文献 摘要 教学优化算法(Teaching-learning-based optimizati ...

  4. 麻雀算法SSA,优化VMD,适应度函数为最小包络熵,包含MATLAB源代码,直接复制粘贴!

    首先声明,本篇文章直接包含所有matlab源代码,直接复制粘贴即可运行,全部都是源代码,可以自己更改的源代码!(不是.p文件!!!,浅浅痛斥一下很多文章为了盈利,还给程序加密!谴责!!)都是学生时代走 ...

  5. 递归 算法思路和优化和简单实现: 黑白子交换

    原文链接: 递归 算法思路和优化和简单实现: 黑白子交换 上一篇: fabric 绘制心形线 下一篇: 解决steam生化奇兵无限启动报错: steam 服务器 过于繁忙... [已解决] 题目和原解 ...

  6. 数据 + 进化算法 = 数据驱动的进化优化?进化算法 PK 数学优化

    数据 + 进化算法 = 数据驱动的进化优化?进化算法 PK 数学优化 https://baijiahao.baidu.com/s?id=1600164518587031730&wfr=spid ...

  7. 常见面试之机器学习算法思想简单梳理

    找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位 ...

  8. paper 17 : 机器学习算法思想简单梳理

    前言: 本文总结的常见机器学习算法(主要是一些常规分类器)大概流程和主要思想. 朴素贝叶斯: 有以下几个地方需要注意: 1. 如果给出的特征向量长度可能不同,这是需要归一化为通长度的向量(这里以文本分 ...

  9. 生物效应大数据评估聚类算法的并行优化

    生物效应大数据评估聚类算法的并行优化 彭绍亮1,2,杨顺云2,孙哲1,程敏霞1,崔英博2,王晓伟2,李非3,伯晓晨3,廖湘科2 1. 湖南大学信息科学与工程学院&国家超级计算长沙中心,湖南 长 ...

最新文章

  1. linux 编译opencl,OpenCL编译环境配置(VS+Nvidia)
  2. 分治策略解决幂乘问题
  3. GPUImage滤镜之锐化
  4. Linux套接字与虚拟文件系统
  5. 用image控件不能正常显示Sql server2000数据库中的图片
  6. Filtering microblogging messages for Social TV
  7. 从OpenFOAM的源码中查找信息
  8. [linx] ubuntu网络重启命令
  9. 在线便携小电视源码 云电视源码
  10. 商户分账交易汇总和商户交易汇总不一致
  11. 批处理 备份网络数据
  12. Flink CDC 系列 - Flink MongoDB CDC 在 XTransfer 的生产实践
  13. 最新YYCMS影视源码_比米酷好用_模板超好看
  14. 基于大数据的主动科研管理模式与优化决策机制
  15. windows聚焦壁纸不更新_如何解决Win10聚焦锁屏壁纸不自动更新的问题
  16. css实现两个div填满一行
  17. CS229 机器学习课程复习材料-线性代数
  18. vue.js动态计时器_基于Vue.js的Pomodoro技术计时器
  19. 15051:小Biu的区间和
  20. 微信小程序-菜谱APP

热门文章

  1. k8s入门之Secret(十)
  2. [总结]Unix设计哲学 Unix编程艺术
  3. 【编程】8086/8088CPU最小/大模式
  4. 【A-003】python数据分析与机器学习实战 Python科学计算库 Pandas数据分析处理库(二)
  5. 聚类算法:K-means聚类与系统(层次)聚类SPSS操作
  6. linux基础操作入门笔记
  7. 计算机应用基础单元教学设计,《计算机应用基础》课程单元教学设计.doc
  8. 局域网流量分析及工具
  9. nmap的官网下载安装、简单命令的抓包测试
  10. 计算机上标和下标的快捷键,Word中设置上标和下标,上标与下标的快捷键是什么?...