函数说明
numpy.interp是一个用于一维线性插值的函数,它可以方便地对给定的x值进行插值计算。下面是numpy.interp函数的详细说明:
函数定义:
numpy.interp(x, xp, fp)
参数说明:
x
:待插值的x值数组或单个x值。xp
:一维数组,表示x值的实际值。fp
:与xp等长的数组,表示与xp对应的函数值。- 返回值:返回插值后的y值数组或单个y值
下面看一个例子就知道是干啥的了:
import numpy as np
# Known data points
xp = [1, 2, 3, 4, 5] # x-coordinates
fp = [3, 8, 12, 16, 20] # y-coordinates
# Points to interpolate
x = [2.5, 3.5, 4.5]
# Interpolation
y = np.interp(x, xp, fp)
print(y)
翻译成C++代码
将 numpy.interp 的功能转换为 C++ 涉及手动实现线性插值算法。在 C++ 中,没有与 numpy.interp 直接等效的内置函数,因此需要创建一个函数来根据给定的输入数组执行线性插值。
本示例假设输入数组 xp 和 fp 已排序,并且 x 包含需要插值的点。它不涵盖外推法(当 x 的值超出 xp 的范围时),但可以修改入参范围,限制在内部范围内。
#include <iostream>
#include <vector>
// Function to perform linear interpolation.
// xp and fp are vectors containing the x and f(x) points respectively.
// x is the vector containing the points where interpolation is needed.
std::vector<double> interp(const std::vector<double>& x, const std::vector<double>& xp, const std::vector<double>& fp) {
std::vector<double> y(x.size(), 0.0); // Result vector
for (size_t i = 0; i < x.size(); ++i) {
if (x[i] <= xp.front()) {
y[i] = fp.front(); // Use the first y-value if x is before the first xp
} else if (x[i] >= xp.back()) {
y[i] = fp.back(); // Use the last y-value if x is after the last xp
} else {
// Find two points in xp such that xp[j] <= x[i] < xp[j+1]
for (size_t j = 0; j < xp.size() - 1; ++j) {
if (x[i] >= xp[j] && x[i] < xp[j+1]) {
// Perform linear interpolation
double slope = (fp[j+1] - fp[j]) / (xp[j+1] - xp[j]);
y[i] = fp[j] + slope * (x[i] - xp[j]);
break;
}
}
}
}
return y;
}
int main() {
// Example usage
std::vector<double> xp = {1, 2, 3, 4, 5};
std::vector<double> fp = {3, 8, 12, 16, 20};
std::vector<double> x = {2.5, 3.5, 4.5};
std::vector<double> y = interp(x, xp, fp);
// Print the interpolated values
for (size_t i = 0; i < y.size(); ++i) {
std::cout << "Interpolated value at " << x[i] << " is " << y[i] << std::endl;
}
return 0;
}