NumCpp  2.6.2
A Templatized Header Only C++ Implementation of the Python NumPy Library
Functions/interp.hpp
Go to the documentation of this file.
1 
28 #pragma once
29 
31 #include "NumCpp/NdArray.hpp"
32 #include "NumCpp/Utils/interp.hpp"
33 
34 #include <string>
35 
36 namespace nc
37 {
38  //============================================================================
47  template<typename dtype>
48  constexpr double interp(dtype inValue1, dtype inValue2, double inPercent) noexcept
49  {
50  return utils::interp(inValue1, inValue2, inPercent);
51  }
52 
53  //============================================================================
54  // Method Description:
71  template<typename dtype>
72  NdArray<dtype> interp(const NdArray<dtype>& inX, const NdArray<dtype>& inXp, const NdArray<dtype>& inFp)
73  {
74  // do some error checking first
75  if (inXp.size() != inFp.size())
76  {
77  THROW_INVALID_ARGUMENT_ERROR("inXp and inFp need to be the same size().");
78  }
79 
80  if (inX.min().item() < inXp.min().item() || inX.max().item() > inXp.max().item())
81  {
82  THROW_INVALID_ARGUMENT_ERROR("endpoints of inX should be contained within inXp.");
83  }
84 
85  // sort the input inXp and inFp data
86  NdArray<uint32> sortedXpIdxs = argsort(inXp);
87  NdArray<dtype> sortedXp(1, inFp.size());
88  NdArray<dtype> sortedFp(1, inFp.size());
89  uint32 counter = 0;
90  for (auto sortedXpIdx : sortedXpIdxs)
91  {
92  sortedXp[counter] = inXp[sortedXpIdx];
93  sortedFp[counter++] = inFp[sortedXpIdx];
94  }
95 
96  // get the sorted input inX array indices
97  NdArray<uint32> sortedXIdxs = argsort(inX);
98 
99  NdArray<dtype> returnArray(1, inX.size());
100 
101  uint32 currXpIdx = 0;
102  uint32 currXidx = 0;
103  while (currXidx < inX.size())
104  {
105  const auto sortedXIdx = sortedXIdxs[currXidx];
106  const auto x = inX[sortedXIdx];
107  const auto xPLow = sortedXp[currXpIdx];
108  const auto xPHigh = sortedXp[currXpIdx + 1];
109  const auto fPLow = sortedFp[currXpIdx];
110  const auto fPHigh = sortedFp[currXpIdx + 1];
111 
112  if (xPLow <= x && x <= xPHigh)
113  {
114  const double percent = static_cast<double>(x - xPLow) / static_cast<double>(xPHigh - xPLow);
115  returnArray[sortedXIdx] = utils::interp(fPLow, fPHigh, percent);
116  ++currXidx;
117  }
118  else
119  {
120  ++currXpIdx;
121  }
122  }
123 
124  return returnArray;
125  }
126 } // namespace nc
#define THROW_INVALID_ARGUMENT_ERROR(msg)
Definition: Error.hpp:36
Holds 1D and 2D arrays, the main work horse of the NumCpp library.
Definition: NdArrayCore.hpp:72
size_type size() const noexcept
Definition: NdArrayCore.hpp:4497
NdArray< dtype > min(Axis inAxis=Axis::NONE) const
Definition: NdArrayCore.hpp:3180
NdArray< dtype > max(Axis inAxis=Axis::NONE) const
Definition: NdArrayCore.hpp:3123
constexpr double interp(double inValue1, double inValue2, double inPercent) noexcept
Definition: Utils/interp.hpp:43
Definition: Coordinate.hpp:45
constexpr double interp(dtype inValue1, dtype inValue2, double inPercent) noexcept
Definition: Functions/interp.hpp:48
NdArray< uint32 > argsort(const NdArray< dtype > &inArray, Axis inAxis=Axis::NONE)
Definition: argsort.hpp:47
std::uint32_t uint32
Definition: Types.hpp:40