2011-03-14 46 views
1

我工作的一個算法來找到一個List對象峯找到一個給定的寬度內的峯。我認爲我認爲這是一個好的(或足夠好的)算法,通過查看一個點,它是鄰居,如果它是一個高峯,將它添加到結果列表中。但是,鑑於最近的一些結果,我認爲這種方法不像我最初希望的那樣工作。 (我已經包含了我目前使用的代碼,並希望在下面進行替換)。我之前已經使用LabView做了一些工作,並且我知道他們的模塊發現峯/谷的方式適用於我需要做的事情。我做了一些研究,LabVIEW如何做到這一點,發現這個:C# - 通過二次擬合

「這個峯值檢波器VI是基於適合二次多項式的數據點的連續組的算法配合使用的數據點的數量。由寬度指定

對於每個峯或谷,將對照閾值對二次擬合進行測試,高度低於閾值的峯或谷值高於閾值的谷被忽略,峯和谷僅在VI處理大約寬度/ 2個數據點,超出峯值或谷值的位置。這種延遲僅影響實時處理。「

好了,現在我一直試圖做的在C#中類似的東西,但是,在我所有的搜索似乎是一個二次多項式擬合數據肯定是不平凡的。我認爲這個問題會被探索很多次,但是我一直沒有成功地找到一個能很好地完成這項工作的算法,或者找到一個能夠實現這個目標的庫。

這個問題的任何幫助是極大的讚賞。謝謝。

原始/目前代碼:

public static List<double> FindPeaks(List<double> values, double rangeOfPeaks) 
{ 
    List<double> peaks = new List<double>(); 

    int checksOnEachSide = (int)Math.Floor(rangeOfPeaks/2); 
    for (int i = checksOnEachSide; i < values.Count - checksOnEachSide; i++) 
    { 
     double current = values[i]; 
     IEnumerable<double> window = values; 
     if (i > checksOnEachSide) 
      window = window.Skip(i - checksOnEachSide); 
     window = window.Take((int)rangeOfPeaks); 
     if (current == window.Max()) 
      peaks.Add(current); 
    } 
    return peaks; 
} 

回答

0

我在C#中使用Math.NET的矩陣運算這樣的。它具有您可能需要的最小二乘問題的所有工具,如QR分解或SVD。對於如何應用它們的一般概述,我認爲wikipedia做得不錯。