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

理论可以看我下面推荐的博客,我直接上代码

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;//相当于原数组的下标
        } 
        private void Form1_Load(object sender, EventArgs e)
        {
            Matrix<double> m = MatlabReader.Read<double>(@"E:\RamanSpectrum_graduation\PeakSearching\PeakSearching\bin\Debug\yuanshuju.mat");//读取MATLAB中的数据,
            Array testArray = m.ToArray();
            double[] data = new double[testArray.Length];
            int j = 0;
            foreach(double GG in testArray)
            {
                data[j] = GG;
                j++;
            }
            int[] index = getPeaksIndex(trendSign(oneDiff(data)));
            double[] data2 = new double[index.Length];
            for(int i=0;i< index.Length;i++)
            {
                data2[i] = data[index[i]];//峰值点放在这里
            }
        }

测试数据可以在这里下载https://download.csdn.net/download/weixin_42974146/12503942
最后实现的效果可以看博客在zedGraph曲线上显示数据,显示波峰,寻峰算法的实现

上述算法思想转载至波峰波谷算法,感谢博主分享,同时参考了其它博主的分享
参考博客C# 使用Math.NET读取mat格式文件内容
参考博客C# 实现寻峰算法的简单优化(包含边峰,最小峰值,峰距)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值