我有一个数组(实际上是std::vector
)大小〜7k个元素。
如果绘制此数据,将有一个燃料燃烧图。但是我想将此向量从7k元素最小化到721个元素(每0.5度)或1200个元素(每0.3度)。当然我要保存图相同。我该怎么做?
现在,我要从大向量到新向量获取每9个元素,并从向量的正面和背面平均切开其他元素以得到721大小。
QVector <double> newVMTVector;
for(QVector <double>::iterator itv = oldVmtDataVector.begin(); itv < oldVmtDataVector.end() - 9; itv+=9){
newVMTVector.push_back(*itv);
}
auto useless = newVMTVector.size() - 721;
if(useless%2 == 0){
newVMTVector.erase(newVMTVector.begin(), newVMTVector.begin() + useless/2);
newVMTVector.erase(newVMTVector.end() - useless/2, newVMTVector.end());
}
else{
newVMTVector.erase(newVMTVector.begin(), newVMTVector.begin() + useless/2+1);
newVMTVector.erase(newVMTVector.end() - useless/2, newVMTVector.end());
}
newVMTVector.squeeze();
oldVmtDataVector.clear();
oldVmtDataVector = newVMTVector;
我可以发誓,有一种算法可以平均并减少数组。
最佳答案
您需要的是插值。有许多库提供多种插值类型。这个非常轻巧,易于设置和运行:
http://kluge.in-chemnitz.de/opensource/spline/
您需要做的就是创建包含X值的第二个矢量,传递两个矢量以生成样条曲线,并每0.5度或以下角度生成插值结果:
std::vector<double> Y; // Y is your current vector of fuel combustion values with ~7k elements
std::vector<double> X;
X.reserve(Y.size());
double step_x = 360 / (double)Y.size();
for (int i = 0; i < X.size(); ++i)
X[i] = i*step_x;
tk::spline s;
s.set_points(X, Y);
double interpolation_step = 0.5;
std::vector<double> interpolated_results;
interpolated_results.reserve(std::ceil(360/interpolation_step) + 1);
for (double i = 0.0, int j = 0; i <= 360; i += interpolation_step, ++j) // <= in order to obtain range <0;360>
interpolated_results[j] = s(i);
if (fmod(360, interpolation_step) != 0.0) // for steps that don't divide 360 evenly, e.g. 0.7 deg, we need to close the range
interpolated_results.back() = s(360);
// now interpolated_results contain values every 0.5 degrees
这应该给您和想法如何使用这种类型的库。如果需要其他插值类型,只需找到适合您需要的插值类型即可。用法应类似。