54 const Data_*
const x_fit,
56 const std::size_t num_points_out,
57 const Data_*
const x_out
59 const auto& anchors = windows_fit.anchors;
60 const auto num_anchors = anchors.size();
63 sanisizer::resize(output.boundaries, num_anchors);
65 std::size_t counter = 0;
67 const auto right = x_fit[anchors[0]];
68 while (counter < num_points_out && x_out[counter] < right) {
73 for (I<
decltype(num_anchors)> i = 1; i < num_anchors; ++i) {
74 output.boundaries[i - 1] = counter;
75 if (counter == num_points_out) {
78 const auto right = x_fit[anchors[i]];
79 while (counter < num_points_out && x_out[counter] < right) {
86 const auto right = x_fit[anchors[num_anchors - 1]];
87 while (counter < num_points_out && x_out[counter] == right) {
90 output.boundaries[num_anchors - 1] = counter;
129 const Data_*
const x_fit,
131 const Data_*
const fitted_fit,
132 const Data_*
const x_out,
134 Data_*
const fitted_out,
137 const auto& anchors = windows_fit.anchors;
138 const auto num_anchors = anchors.size();
139 assert(num_anchors > 0);
140 const auto num_anchors_m1 = num_anchors - 1;
147 parallelize(num_threads, num_anchors_m1, [&](
const int,
const I<
decltype(num_anchors_m1)> start,
const I<
decltype(num_anchors_m1)> length) {
148 for (I<
decltype(start)> s = start, end = start + length; s < end; ++s) {
149 const auto run_start = assigned_out.boundaries[s];
150 const auto run_end = assigned_out.boundaries[s + 1];
151 if (run_start == run_end) {
155 const auto left_anchor = windows_fit.anchors[s];
156 const auto right_anchor = windows_fit.anchors[s + 1];
157 const Data_ xdiff = x_fit[right_anchor] - x_fit[left_anchor];
158 const Data_ ydiff = fitted_fit[right_anchor] - fitted_fit[left_anchor];
160 const Data_ slope = ydiff / xdiff;
161 const Data_ intercept = fitted_fit[right_anchor] - slope * x_fit[right_anchor];
162 for (
auto outpt = run_start; outpt < run_end; ++outpt) {
163 fitted_out[outpt] = slope * x_out[outpt] + intercept;
167 const Data_ ave = fitted_fit[left_anchor] + ydiff / 2;
168 std::fill(fitted_out + run_start, fitted_out + run_end, ave);
196 const Data_*
const x_fit,
198 const Data_*
const fitted_fit,
199 const std::size_t num_points_out,
200 const Data_*
const x_out,
201 Data_*
const fitted_out,
204 const auto assigned_out =
assign_to_segments(x_fit, windows_fit, num_points_out, x_out);
205 interpolate(x_fit, windows_fit, fitted_fit, x_out, assigned_out, fitted_out, num_threads);
AssignedSegments assign_to_segments(const Data_ *const x_fit, const PrecomputedWindows< Data_ > &windows_fit, const std::size_t num_points_out, const Data_ *const x_out)
Definition interpolate.hpp:53
void interpolate(const Data_ *const x_fit, const PrecomputedWindows< Data_ > &windows_fit, const Data_ *const fitted_fit, const Data_ *const x_out, const AssignedSegments &assigned_out, Data_ *const fitted_out, int num_threads)
Definition interpolate.hpp:128