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

C Program to find Windowed Average of a sequence of values, given their timestamps

   |    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)。然而,问题在于这些时间戳是相当随意的,即它们不是周期性的。那么我怎么知道什么时候停止查看数组呢?

编辑:这个 link 似乎是相关的: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

所以您有真实的输入数据,这些数据在不规则的时刻到达,并且想要计算滑动 window/moving 平均值。

我的方法是拥有一个输入 data/time 标记对的数组(列表),并在另一个数组中构建缺失时间点的内插值。然后计算window.

数组必须足够大以容纳两个输入时间戳之间的所有时刻。在计算出第一个 window 后,将数组向下移动 window 大小并继续。