標籤:作者 hat for c++ sign 數組 www. 尋找 https
原文:C#實現局部峰值尋找,功能對應Matlab中的findpeaks.m
相關演算法的原理參考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