gpt4 book ai didi

C 程序在给定时间戳的情况下查找一系列值的窗口平均值

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:53 24 4
gpt4 key购买 nike

   |    7    |     8     |     0     |     4     |  <- average

|
10 | +-------------+
8 | | | +--------
| | | |
4 |----+ | |
| | |
+----5----10----15-+==20====25====30====35----40
t ->

Input:
[ (timestamp, new_value), ...]
e.g.: [(0,4), (5,10), (18,0), (35,8), ...]

given:
#define WINDOW_SIZE 10;

Print windowed average:
7, 8, 0, 4, ...

我很难通过代码思考这个问题。我能想到的一种方法是将 (timestamp, value) 对分解为它们的最低单位,比如 1 个时间单位,这使得代码更容易编写,但计算量大。

编辑:例如,第一个值为 7,因为我计算了 5 个时间步长的曲线下面积 (4*5 = 20) 以及接下来 5 个时间步长的曲线下面积 (10*5 = 50 ) 然后将这 2 添加并除以 WINDOW_SIZE (70/10 = 7)。然而,问题在于这些时间戳是相当随意的,即它们不是周期性的。那么我怎么知道什么时候停止查看数组呢?

编辑:这个链接似乎是相关的:Calculating moving average in C++

最佳答案

平均值是曲线下的面积(数学积分)除以时间段。每次超过时间阈值时打印平均值:

#define WINDOW_SIZE 10

void runningAverage( int startTime, int time, int value, int *area )
{
int A = *area;
for ( int i = startTime/WINDOW_SIZE; i < time/WINDOW_SIZE; i ++ )
{
int newT = (i+1) * WINDOW_SIZE; // timespane to next threshold
A += ( newT - startTime ) * value; // add sub area
printf( "%d ", A / WINDOW_SIZE ); // print average

startTime = newT; // set new start time
A = 0; // reset area
}
*area = A + (time-startTime) * value; // add area
}

int main()
{
int area = 0;
runningAverage( 0, 5, 4, &area );
runningAverage( 5, 18, 10, &area );
runningAverage( 18, 35, 0, &area );
runningAverage( 35, 40, 8, &area );
return 0;
}

输出:7 8 0 4

关于C 程序在给定时间戳的情况下查找一系列值的窗口平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35802441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com