C#实现局部峰值查找,功能对应Matlab中的findpeaks.m

摘要:
privatedouble[]oneDiff(double[]数据){double[]result=newdouble[data.Length-1];i++){result[i]=data[i+1]-data[i];}returnresult;elseif(数据[i]==0)符号[i]=0;=0i-){if(符号[i]==0&

相关算法的原理参考Ronny,地址:图像分析:投影曲线的波峰查找,这里感谢下原作者。

参照C++的代码实现,我用C#翻译了下,其实原理也很简单的,下面放相关实现代码:

        private double[] oneDiff(double[] data) 
        {
            double[] result = new double[data.Length - 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 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);
                }
            }
            int[] result = new int[data.Count];
            for (int i = 0; i < result.Length; i++)
            {
                result[i] = data[i];
            }
            return result;//相当于原数组的下标
        }

调用方法:

double[] data = {25, 8, 15, 5, 6, 10, 10, 3, 1, 20, 7};
int[] index = getPeaksIndex(trendSign(oneDiff(Constant.data)));

返回的int[]数组内容是对应原数组中峰值对应的索引(从0开始)

免责声明:文章转载自《C#实现局部峰值查找,功能对应Matlab中的findpeaks.m》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Django之F和Q查询等其他查询扩展WinForm的ComboBox下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SDWebImage缓存机制

存 取 删 路径 1.1 存 是在storeImage这个方法里: 将图片储存到内存和硬盘上 -(void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDis...

web前端图片上传(2)

今天发现了一种ajax上传图片的方式,是以前没有用过的,首先来说下为什么要用这种方式。是因为原来后台是用的form表单的方式来提交表单数据的。但是觉得呢,这种方式不太好,因为要刷新页面,前台只用控制台看不到传输的参数(如果哪位大神知道怎么看到,请不吝赐教),所以我们就改成了ajax的方式,结果后台老哥说,前端改改就行了,后端不用改。然后我去找到了这种aja...

eMMC基础技术6:eMMC data读写

1. 前言 data可以经data线从host发往device,也可以从device发往host 数据线以是1线(DATA0),4线(DATA0~DATA3),8线(DATA0~DATA7) 对每条数据线,每个时钟周期可以传输1bit(single data rate)和2bits(dual data rate)数据 2. data传输 eMMC传输是...

vue后台(一)

一,项目准备工作 1.拿到已经是二次开发的代码, npm i , 安装依赖包 ES6模块暴露和导入复习 1. 导出方式一: 默认一次性导出 (只能有一个) export default xxx 本质: 整个模块是一个对象, 对象中有default属性, 即: {default: xxx} 2....

mpvue 使用echarts动态绘制图表(数据改变重新渲染图表)

  最近在公司开发一款微信小程序,按照客户需求用饼状图显示当前设备状态(开机、故障、关机),于是就在网上寻找各种资料,找了很多mpvue使用关于echarts绘制图表,最终功夫不负有心人,找到一篇关于mpvue使用echarts的文章,链接点击这里,需要的同学自行查看。这里面说明了如何使用echarts绘制图表,其中echarts的配置项option大家可...

DOCKER 从入门到放弃(五)

添加docker启动参数修改存储大小 添加--storage-opt 参数设置thin-pool和元数据大小--storage-opt dm.loopmetadatasize=10G --storage-opt dm.loopdatasize=400G 修改thin-pool池大小为400g,元数据大小为10g [root@docker opt]# cat...