int main(int argc, char* argv[])
{
//getData("C:\\Users\\Zhangwei\\Desktop\\test.xml"); //读取.xml文件的路径
//vector<double> datax, datay;//输入
vector<double> datax = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<double> datay = { 19, 12, 3, 14, 17, 20, 7, 8, 9, 10 };
///////////////////////////// 曲线拟合 //////////////////////////////
//step1: 寻找最高点,并将原始数据分为两个向量
vector<double>::iterator highPoint_y = max_element(begin(datay), end(datay)); //获取向量datay的最大元素
double maxelmentIndex = distance(begin(datay), highPoint_y); //获取向量datay的最大元素的索引位置
double highPoint_x = datax[maxelmentIndex]; //获取向量datay的最大元素的索引位置,对应datax中的元素highPoint_x
//cout << *highPoint_y << " " << highPoint_x << endl;
vector<double> datax1, datax2;
vector<double> datay1, datay2;
datax1.assign(datax.begin(), datax.begin() + maxelmentIndex + 1); //将向量datax的第1个值到第maxelmentIndex+1个值赋值给向量datax1
datax2.assign(datax.begin() + maxelmentIndex + 1, datax.end()); //将向量datax的第maxelmentIndex+1个值到最后一个值赋值给向量datax2
datay1.assign(datay.begin(), datay.begin() + maxelmentIndex + 1); //将向量datay的第1个值到第maxelmentIndex+1个值赋值给向量datay1
datay2.assign(datay.begin() + maxelmentIndex + 1, datay.end()); //将向量datay的第maxelmentIndex+1个值到最后一个值赋值给向量datay2
//step2: 利用dataMean函数,分别对两个向量进行降维操作,第一个的窗宽设置为10,第二个的窗宽设置为150
vector<double> getDatax1, getDatax2;
vector<double> getDatay1, getDatay2;
getDatax1 = dataMean(datax1, 2); //对向量datax1进行滑窗处理
getDatay1 = dataMean(datay1, 2); //对向量datay1进行滑窗处理
getDatax2 = dataMean(datax2, 2); //对向量datax2进行滑窗处理
getDatay2 = dataMean(datay2, 2); //对向量datay2进行滑窗处理
//step3: 针对第一组数据,采取10阶多项式拟合,寻找曲线上边变化率最大的点,并返回第一组数据的拟合结果
vector<double> coefficientsSet1;//定义多项式拟合的系数向量
coefficientsSet1 = fitCurve(getDatax1, getDatay1, 1);//调用fitCurve函数进行拟合
//step4: 针对第二组数据,采取2~4阶多项式拟合,并返回第二组数据的拟合结果
vector<double> coefficientsSet2;//定义多项式拟合的系数向量
coefficientsSet2 = fitCurve(getDatax2, getDatay2, 2);//调用fitCurve函数进行拟合
//step5: 求向量datax拟合的数据finalData_y, maxelmentIndex, biggestSlopeIndex, finalResult_x, finalResult_y
vector<double> finalData_y, biggestSlopeIndex;
vector<double> finalResult_x, finalResult_y;
for (int j = 0; j < getFitPoint(coefficientsSet1, datax1).size(); j++)
{
finalData_y.push_back(getFitPoint(coefficientsSet1, datax1)[j]); //将第一次划分的向量datax1带入拟合曲线中,得到拟合后的结果
}
for (int s = 0; s < getBiggestSlope(datax1, finalData_y).size(); s++)
{
biggestSlopeIndex.push_back(getBiggestSlope(datax1, finalData_y)[s]); //求第一段拟合曲线的斜率最大的点的位置
}
for (int i = 0; i < biggestSlopeIndex.size(); i++)
{
finalResult_x.push_back(datax1[biggestSlopeIndex[i]]); //添加第一段拟合曲线中斜率最大的点的横坐标
}
finalResult_x.push_back(datax1[maxelmentIndex]); //添加最高点对应的横坐标
for (int i = 0; i < biggestSlopeIndex.size(); i++)
{
finalResult_y.push_back(finalData_y[biggestSlopeIndex[i]]); //添加第一段拟合曲线中斜率最大的点的纵坐标
}
finalResult_y.push_back(finalData_y[maxelmentIndex]); //添加最高点对应的纵坐标
for (int k = 0; k < getFitPoint(coefficientsSet2, datax2).size(); k++)
{
finalData_y.push_back(getFitPoint(coefficientsSet2, datax2)[k]); //将第一次划分的向量datax2带入拟合曲线中,得到拟合后的结果
}
for (int i = 0; i < datax.size(); i++)
{
finalResult_x.push_back(datax[i]); //添加原始的向量datax,即横坐标
}
for (int i = 0; i < finalData_y.size(); i++)
{
finalResult_y.push_back(finalData_y[i]); //添加拟合后的向量finalData_y,即纵坐标
}
//输出结果
for (int l = 0; l < finalResult_y.size(); l++)
{
cout << finalResult_y[l] << endl;
}
//最终的输出结果
system("pause");
return 0;
}