Kann ich bitte etwas Hilfe dabei haben. Ich habe ein Array (Vektor von Vektoren), InitTermStructure
. Ich habe eine Funktion, die Interpolation durchführt, wenn die Differenz zwischen aufeinanderfolgenden ersten Elementen nicht 0,5 ist. Die interpolierten Daten werden im Vektor "Temp" gespeichert.C++ merge und sortiere 2 Vektoren
Ich versuche dann die InitTermStructure
und Temp
Vektoren, nach den ersten Elementen sortiert, zusammenzuführen.
Alle Interpolationsberechnungen funktionieren einwandfrei, die Zusammenführung ändert jedoch die Größe des Zielvektors und fügt Nullen hinzu. Ich gehe davon aus, dass die Dimensionen nicht richtig zusammengeführt werden. Gibt es etwas, das das einschränken kann? Es sollte ein 6x2 sein, das mit einem 2x2 zu einer 8x2 verschmolzen wird.
Code:
#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;
}
Output: 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 4 0,095
Ist das C++ 11 oder später, weil ich sonst glaube, dass Sie ein Leerzeichen zwischen die '>>' Sequenz von 'Vektor>' setzen müssen. –
Sam
Der Fehler scheint ziemlich klar zu sein - fehlendes Template-Argument vor '(', und die Zeile 'std :: back_insert_iterator (...' - kein Template-Argument. Siehe [die Dokumentation] (http://en.cppreference.com/w/cpp/iterator/back_insert_iterator) und notieren Sie das Beispiel –