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 大小并继续。
| 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 大小并继续。