我可以请你帮忙吗?
我有一个数组(向量矢量),InitTermStructure
。
如果连续的第一个元素之间的差异不是0.5,我有一个执行插值的函数。
插值数据存储在矢量“Temp”中。
然后我尝试合并InitTermStructure
和Temp
向量,按第一个元素排序。
所有插值计算都可以正常工作,但合并会调整目标矢量的大小,并添加零。我假设尺寸没有正确合并。有什么东西可以限制这个吗?应该是6x2与2x2合并形成8x2。
代码:
#include <iostream>
#include <algorithm> // merge function
#include <vector>
#include <iterator>
using namespace std;
double Linear_Extrapolation(double X, double x1, double y1, double x2, double y2);
double Linear_Extrapolation(double X, double x1, double y1, double x2, double y2)
{
return(y1 + ((X - x1) / (x2 - x1)) * (y2 - y1));
}
int main() {
const int Mat = 6;
vector<vector<double>> InitTermStructure((Mat), vector<double>(2));
InitTermStructure = {
{ 0.5 , 0.05 },
{ 1.0 , 0.06 },
{ 1.5 , 0.07 },
{ 2.0 , 0.075 },
{ 3.0 , 0.085 },
{ 4.0 , 0.095}
};
double dt = InitTermStructure[0][0];
int Maturities;
int IrregIntervalCount=0;
int count = 0;
double X, Y;
for (int i = 1; i < Mat; i++)
{
if (InitTermStructure[i][0] - InitTermStructure[i-1][0] != dt)
{
IrregIntervalCount = IrregIntervalCount + 1;
}
}
Maturities = IrregIntervalCount + Mat;
vector<vector<double>> Temp((Mat), vector<double>(2));
vector<vector<double>> TermStructure((Maturities), vector<double>(2));
for (int i = 1; i < Mat; i++)
{
if (InitTermStructure[i][0] - InitTermStructure[i-1][0] != dt)
{
X = InitTermStructure[i-1][0] + dt;
count = count +1;
Y = Linear_Extrapolation(X, InitTermStructure[i-1][0], InitTermStructure[i-1][1], InitTermStructure[i][0], InitTermStructure[i][1]);
Temp[count - 1][0] = X;
Temp[count - 1][1] = Y;
}
}
std::merge(InitTermStructure.begin(), InitTermStructure.end(), Temp.begin(), Temp.end(), std::back_insert_iterator<vector<vector<double>>>(TermStructure), [](const auto &a, const auto &b)
{
return a[0] < b[0];
}
);
for (int i = 0; i <= Maturities*2.5; i++) // !!!! Should be (int i = 0; i <= Maturities; i++) Maturities multiplied by 2.5 to show incorrect output.
{
cout << TermStructure[i][0] << " " << TermStructure[i][1] << endl;
}
return 0;
}
输出: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0.05 1 0.06 1.5 0.07 2 0.075 2.5 0.08 3 0.085 3.5 0.09 0 0 0 0 0 0 0 0 4 0.095
答案 0 :(得分:2)
std::back_insert_iterator(TermStructure),
std::back_insert_iterator
是一个模板,例如std::vector
。
你认为像:
std::vector a;
会编译吗?当然不是。您需要指定模板参数。它是什么? std::vector<int>
,或std::vector<char>
等等......
检查完代码后,我相信您希望这样:
std::back_insert_iterator<vector<vector<double>>>(TermStructure),
我没有在这里跟踪所有的数学,所以这可能是也可能不对,但至少它现在编译了。
P.S。这是多余的:
int Mat = 6;
vector<vector<double>> InitTermStructure((Mat), vector<double>(2));
InitTermStructure = {
{ 0.5 , 0.05 },
{ 1.0 , 0.06 },
{ 1.5 , 0.07 },
{ 2.0 , 0.075 },
{ 3.0 , 0.085 },
{ 4.0 , 0.095}
};
您正在初始化固定大小的矢量。然后你立即替换矢量的内容。只需:
就足够了vector<vector<double>> InitTermStructure = {
{ 0.5 , 0.05 },
{ 1.0 , 0.06 },
{ 1.5 , 0.07 },
{ 2.0 , 0.075 },
{ 3.0 , 0.085 },
{ 4.0 , 0.095}
};
也适用于其他初始化。