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