53 const Data_*
const x_fit,
55 const std::size_t num_points_out,
56 const Data_*
const x_out
58 const auto& anchors = windows_fit.anchors;
59 const auto num_anchors = anchors.size();
62 sanisizer::resize(output.boundaries, num_anchors);
64 std::size_t counter = 0;
66 const auto right = x_fit[anchors[0]];
67 while (counter < num_points_out && x_out[counter] < right) {
72 for (I<
decltype(num_anchors)> i = 1; i < num_anchors; ++i) {
73 output.boundaries[i - 1] = counter;
74 if (counter == num_points_out) {
77 const auto right = x_fit[anchors[i]];
78 while (counter < num_points_out && x_out[counter] < right) {
85 const auto right = x_fit[anchors[num_anchors - 1]];
86 while (counter < num_points_out && x_out[counter] == right) {
89 output.boundaries[num_anchors - 1] = counter;
128 const Data_*
const x_fit,
130 const Data_*
const fitted_fit,
131 const Data_*
const x_out,
133 Data_*
const fitted_out,
136 const auto& anchors = windows_fit.anchors;
137 const auto num_anchors = anchors.size();
138 const auto num_anchors_m1 = num_anchors - 1;
145 parallelize(num_threads, num_anchors_m1, [&](
const int,
const I<
decltype(num_anchors_m1)> start,
const I<
decltype(num_anchors_m1)> length) {
146 for (I<
decltype(start)> s = start, end = start + length; s < end; ++s) {
147 const auto run_start = assigned_out.boundaries[s];
148 const auto run_end = assigned_out.boundaries[s + 1];
149 if (run_start == run_end) {
153 const auto left_anchor = windows_fit.anchors[s];
154 const auto right_anchor = windows_fit.anchors[s + 1];
155 const Data_ xdiff = x_fit[right_anchor] - x_fit[left_anchor];
156 const Data_ ydiff = fitted_fit[right_anchor] - fitted_fit[left_anchor];
158 const Data_ slope = ydiff / xdiff;
159 const Data_ intercept = fitted_fit[right_anchor] - slope * x_fit[right_anchor];
160 for (
auto outpt = run_start; outpt < run_end; ++outpt) {
161 fitted_out[outpt] = slope * x_out[outpt] + intercept;
165 const Data_ ave = fitted_fit[left_anchor] + ydiff / 2;
166 std::fill(fitted_out + run_start, fitted_out + run_end, ave);
194 const Data_*
const x_fit,
196 const Data_*
const fitted_fit,
197 const std::size_t num_points_out,
198 const Data_*
const x_out,
199 Data_*
const fitted_out,
202 const auto assigned_out =
assign_to_segments(x_fit, windows_fit, num_points_out, x_out);
203 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:52
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:127