0

在我的程序中每秒调用的函数中,我得到一个浮点值,它代表一些 X 强度。
这些值不断出现,我希望存储最后 30 个值的历史记录,并检查这些值是否存在下降/下降趋势(也可能有 2 或 3 个误报,因此必须忽略这些值)。
如果有下降趋势并且(如果最近的值减去历史中的第一个值)超过 50 的阈值(比如说),我想调用另一个函数。如何在 C# 中实现这样的事情,它具有这样的结构来存储 30 个值的历史,然后分析/推断下降趋势?

4

3 回答 3

2

你有几个选择。如果您只需要每秒调用一次,则可以使用 a Queue<float>,如下所示:

Queue<float> theQueue = new Queue<float>(30);

// once per second:
// if the queue is full, remove an item
if (theQueue.Count >= 30)
{
    theQueue.Dequeue();
}
// add the new item to the queue
theQueue.Enqueue(newValue);

// now analyze the items in the queue to detect a downward trend
foreach (float f in theQueue)
{
    // do your analysis
}

这很容易实现,并且速度足够快,可以每秒运行一次。

您如何分析下降趋势实际上取决于您的定义。

我突然想到,Queue<float>可能无法保证枚举器按照插入的顺序返回内容。如果没有,那么您将不得不实现自己的循环缓冲区

于 2013-08-25T04:55:38.753 回答
0

循环列表是存储最后 X 值的最佳数据结构。标准库中似乎没有一个,但是关于如何构建一个有几个问题。

您需要定义“下降趋势”。在我看来,根据您当前的定义((如果最近的值减去历史中的第一个值)序列“100、150、155、175、180、182”是下降趋势。有了这个定义,你只需要从循环列表中获取历史上最新的和第一个值,稍微简化一下。

但是您可能需要更精细的算法来识别下降趋势。

于 2013-08-26T19:21:09.003 回答
0

我不知道 C#,但我可能会将这些值存储为某种列表。这是趋势检查的一些伪代码:

if last value - first value < threshold
    return
counter = 0
for int i = 1; i < 30; i++
    if val[i] > val[i-1]
        counter++
if counter < false_positive_threshold
    //do stuff
于 2013-08-25T04:34:45.753 回答