我正在尝试有效地计算向量的平均值。 我有一个矩阵(向量矢量),其中:
行:我要回去的日子(250)
专栏:我正在计算的事物类型(10,000种不同的东西)
目前我正在使用.push_back()
,它基本上遍历每列中的每一行,然后我使用erase()
来删除最后一个值。由于此方法遍历所有值,因此我的代码非常慢。
我正在考虑一个与替换相关联的方法,但是我很难实现这个想法,因为所有的值都有一个顺序(即我需要删除旧的值,我添加/替换的值将是最新的)。
以下是我的代码。 任何有关正确方向的解决方案或指南的想法都将受到高度赞赏。
//declaration
vector <vector<float> > vectorOne;
//initialization
vectorOne(250, vector<float>(10000, 0)),
//This is the slow method
vectorOne[column].push_back(1);//add newest value
vectorOne[column].erase(vectorOne[column].begin() + 0); //remove latest value
答案 0 :(得分:1)
您可能需要不同的数据结构。
问题听起来像一个队列。你添加到最后并从前面采取。有了真正的队列,每个人都会洗牌。使用计算机队列,我们可以使用循环缓冲区(您需要能够在最大队列长度上获得合理的限制)。
我建议首先在普通C数组上实现自己的,然后在理解了原理时使用STL版本。
答案 1 :(得分:0)
如果您事先知道数据的大小,可以使用std::array
并取消任何重新分配。 (如果您没有使用引入std::array
的C ++ 11,那么您可以使用 - 而这是我唯一一次建议这样做 - 相反内置数组。)
您的代码格式为:
std::array<std::array<yourdata,10000>250> rollingBuffer;
or
yourdata[250][10000] rollingBuffer;
for(int i = 0; i < CycleLimit; i++){
for(auto row : rollingBuffer){
for(size_t col = 0; col < row.size(); col++) {
row[col] = getNextData(col);
double av;
for(const auto& r : rollingBuffer){
av += r[col];
}
sendAverage(av/yourData.size());
}
}
}
也就是说,它遍历行,将新数据输入到元素中,对该列中的元素求和并将其记录(到另一个2D数组中??),它们移动到下一列。当它到达行的末尾时,它会在下一行再次开始。当它到达行的末尾时,它会再次启动,直到它循环通过您想要的多次迭代。
但它是四个嵌套循环。可能有更好的方法......但是,没有重新分配。与vector
和deque
进行比较会很有意思。