C++ Algorithm to Compute the One-Dimensional (Linear) Interpolat

  • 时间:2020-09-27 14:36:16
  • 分类:网络文摘
  • 阅读:142 次

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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;
}
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) —

推荐阅读:
How to Count the Distinct Pairs using HashMap?  Blogger Jailed For Pokemon Go Gets Even More Trouble  Dead Simple Ways to Keep Your Best Blogging Ideas From Slipping   The Fear of Blogging is Real – Here’s How to Overcome It  Influential Cybersecurity Blogger Gets Digitally Attacked  Building Relationships with Your Influencers  Authorities In Vietnam Arrest Top Blogger For One Criticizing Co  The Top Health Bloggers You Should Be Following  Mashable Blogger: Owning a Samsung Galaxy Note 7 is Safer Than G  5 Ways to Earn Money from Your Website 
评论列表
添加评论