Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-通过二次拟合查找给定宽度内的峰值_C#_Mathematical Optimization_Labview_Quadratic_Derivative - Fatal编程技术网

C#-通过二次拟合查找给定宽度内的峰值

C#-通过二次拟合查找给定宽度内的峰值,c#,mathematical-optimization,labview,quadratic,derivative,C#,Mathematical Optimization,Labview,Quadratic,Derivative,我正在研究一种在列表对象中查找峰值的算法。我想到了一个好的(或足够好的)算法,通过查看一个点和它的邻居,如果是峰值,将其添加到结果列表中。然而,考虑到最近的一些结果,我认为这种方法并不像我最初希望的那样有效。(我已经在下面列出了我目前正在使用并希望替换的代码)。我以前在LabView上做过一些工作,我知道他们的模块找到峰值/谷值的方式适合我需要做的事情。我研究了LabView是如何做到这一点的,并发现: “此峰值检测器VI基于一种算法,该算法将二次多项式拟合到连续的数据点组。拟合中使用的数据点数

我正在研究一种在列表对象中查找峰值的算法。我想到了一个好的(或足够好的)算法,通过查看一个点和它的邻居,如果是峰值,将其添加到结果列表中。然而,考虑到最近的一些结果,我认为这种方法并不像我最初希望的那样有效。(我已经在下面列出了我目前正在使用并希望替换的代码)。我以前在LabView上做过一些工作,我知道他们的模块找到峰值/谷值的方式适合我需要做的事情。我研究了LabView是如何做到这一点的,并发现:

“此峰值检测器VI基于一种算法,该算法将二次多项式拟合到连续的数据点组。拟合中使用的数据点数量由宽度指定

对于每个峰值或谷值,根据阈值测试二次拟合。忽略高度低于阈值的峰值或谷值高于阈值的谷值。只有在VI处理超出峰值或谷值位置约2/2个数据点的宽度后,才能检测到峰值和谷值。此延迟具有影响仅用于实时处理。”

好吧,现在我一直在尝试在C#中做类似的事情,然而,在我所有的搜索中,似乎将二次多项式拟合到数据中并不是一件小事。我认为这个问题会被探索很多次,但是我没有成功地找到一个算法,或者找到一个库来处理它

非常感谢您对这个问题的任何帮助。谢谢

原始/当前代码:

公共静态列表FindPeaks(列表值,双倍范围的峰值)
{
列表峰值=新列表();
int checksOnEachSide=(int)数学楼层(峰值范围/2);
for(int i=checksOnEachSide;i选中每个选项)
window=window.Skip(i-选中每个选项);
window=window.Take((int)峰值范围);
如果(当前==window.Max())
峰值。添加(当前);
}
返回峰值;
}
我在c#中使用过这样的矩阵运算。它有所有的工具,你可能需要的最小二乘问题,如QR分解或奇异值分解。对于如何应用它们的一般概述,我认为它做得相当好

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;
}