计算存储在向量中的值流的移动平均值



i有一个结构的向量,该向量存储了以不同间隔的值来存储的值。该结构由两个元素组成,一个是为了值,另一个记录了该值到达的时间。

struct Data {
    Time timeOfArrival;
    Time value;
}cd;

说,在另一个线程中,我想计算最后10秒(例如)秒内到达的值的移动平均值。因此,在一个线程中,向量被填充了,在另一个线程中,我想计算移动平均线。

这就是我的做法。为简单起见,我按以下方式重新定义数据:

struct Data
{
    int timeOfArrival;
    int value;
};

做您要求的一种方法是使用一个圆形缓冲区,您只存储您的平均移动量所需的数据量。

enum { MOVING_AVG_SIZE = 64, };  // number of elements that you use for your moving average
std::vector<Data> buffer(MOVING_AVG_SIZE);
std::vector<Data>::iterator insertIt = buffer.begin();
// saving to circular buffer
Data newData;
++insertIt
if (insertIt == buffer.end()) insertIt = buffer.begin();
*insertIt = newData;
// average
int sum = 0;
for (std::vector<Data>::const_iterator it = buffer.begin(); it != buffer.end(); ++it)
{
    sum += it->value;
}
float avg = sum / (float)buffer.size();

如果您没有圆形缓冲区,并且只需向矢量添加值,那么您就可以获得计算平均值所需的最后数量元素。

// saving to circular buffer
Data newData;
buffer.push_back(newData);
// average
// this algorithm calculates the moving average even if there is not enough samples in the buffer for the "10 s" 
std::vector<Data>::const_reverse_iterator it = buffer.rbegin();
int i;
int sum = 0;
for (i = 0; i < MOVING_AVG_SIZE || it == buffer.rend(); ++i)
{
    sum += it->value;
}
float avg = sum / (float)i;

您已经确定一个线程将始终填充,另一个线程将进行平均移动。然后,您可以这样做:

保持一个带有两个元素runningsum的结构,并且在矢量中没有项目。

编写一个循环,该循环消除了超过10秒的元素,并从runningsum中扣除其值。所有Elemenst载体都在TimeFarrival上进行分类,因此您无需迭代整个向量。添加以汇总尚未添加的新Elemnt的价值。

您需要一种方法来取消已添加的项目(总和使用)以及尚未求和的项目。您可以为此使用布尔值,也可以将它们放入新的数据架构中(在您的课程内部)。

保持元素数量的计数并计算平均值。

相关内容

  • 没有找到相关文章

最新更新