Consider the time series of measurements m = [40.0, 41.0, 40.0, 45.0] and time points t1 = [0.0, 1.1, 1.9, 3.0] respectively and another sequence of time points t2 = [0.4, 0.7, 1.8, 2.9, 3.3].
Write a function to, where possible, return the one-dimensional interpolated values of m at t2.
double interpolated(double targetValue, double x1, double x2, double y1, double y2) {
auto x = x2 - x1;
return (targetValue - x1) / x * y1 + (x2 - targetValue) / x * y2;
}
// assume m and t1 is sorted in non-descending order
vector<double> linearPolated(const vector<double> &t1, const vector<double> &m, const vector<double> &t2) {
auto sz_t1 = t1.size();
auto sz_m = m.size();
// input sizes of t1 and m should be equal
assert(sz_t1 == sz_m);
auto sz_t2 = t2.size();
vector<double> r;
r.reserve(sz_t2);
for (const auto &n: t2) {
int j = 0;
for (int i = 0; i < sz_t1 - 1; ++ i) {
if (n >= t1[i] && n <= t1[i + 1]) {
j = i;
break;
}
}
// TODO: check how interpolation actually works.
auto nv = interpolated(n, t1[j], t1[j + 1], m[j], m[j + 1]);
r.push_back(nv);
}
return r;
}
Note: above C++ code may not have been tested.
–EOF (The Ultimate Computing & Technology Blog) —
Last Post: C++ Algorithms to Find Pair of Sum Given a Collection of Numbers
Next Post: Algorithm to Compute the Shortest Distance between Points on Two Lines