Matlab中基于已知向量点对插值生成N个中间点的实现问询
解决相邻点间插入N个插值点的问题
这事儿其实用线性插值就能轻松搞定,不管你要插2个还是N个点都通用!我给你用Python举个具体的实现例子,分两种场景:均匀插值(最常用)和自定义非均匀插值(匹配你示例里的非均匀点)。
方法一:均匀插值(用Numpy快速实现)
如果只需要在每对相邻点之间插入均匀分布的新点,用Numpy的linspace函数就足够了,步骤很清晰:
- 遍历每一对相邻的已知(x,y)点;
- 在每对点之间生成包含端点在内的
N+2个点(这样刚好能得到N个中间插值点); - 拼接所有段的时候,去掉每段的最后一个点(避免和下一段的起点重复),最后再补上原始数据的最后一个端点。
代码示例:
import numpy as np # 原始数据 x = np.array([7, 8, 8, 8]) y = np.array([13, 14, 15, 16]) N = 2 # 每对相邻点之间要插入的新点数 # 初始化存储结果的列表 x_new = [] y_new = [] # 遍历每一对相邻点 for i in range(len(x) - 1): # 生成当前区间的x、y插值点(包含两端,共N+2个点),去掉最后一个点避免重复 segment_x = np.linspace(x[i], x[i+1], num=N+2)[:-1] segment_y = np.linspace(y[i], y[i+1], num=N+2)[:-1] # 添加到结果列表 x_new.extend(segment_x) y_new.extend(segment_y) # 补上最后一个原始端点 x_new.append(x[-1]) y_new.append(y[-1]) # 转成numpy数组方便后续处理 x_new = np.array(x_new) y_new = np.array(y_new) print("插值后的x:", x_new) print("插值后的y:", y_new)
运行这段代码后,你会得到均匀分布的插值点:
插值后的x: [7. 7.33333333 7.66666667 8. 8. 8. 8. ] 插值后的y: [13. 13.33333333 13.66666667 14. 14.33333333 14.66666667 15. 15.33333333 15.66666667 16. ]
方法二:非均匀插值(自定义插值点位置)
如果想要像你示例里那样的非均匀点(比如7→7.4→7.7→8),可以用Scipy的interp1d函数先构建插值函数,再自定义插值点的位置:
import numpy as np from scipy.interpolate import interp1d # 原始数据 x = np.array([7, 8, 8, 8]) y = np.array([13, 14, 15, 16]) N = 2 # 每对相邻点之间要插入的新点数 # 构建线性插值函数(也可以指定kind='quadratic'用二次插值) f = interp1d(x, y, kind='linear') # 自定义插值点位置(这里模拟你示例里的非均匀间隔) x_interp = [] for i in range(len(x)-1): start = x[i] end = x[i+1] # 手动指定中间点,比如7到8之间取7.4和7.7 if start ==7 and end ==8: middle_points = [7.4,7.7] else: # 其他区间如果是相同值,直接生成重复点 middle_points = [start]*N # 拼接当前区间的所有点:起点 + 中间点 segment = [start] + middle_points x_interp.extend(segment) # 补上最后一个端点 x_interp.append(x[-1]) # 计算对应的y值 y_interp = f(x_interp) print("自定义插值后的x:", x_interp) print("自定义插值后的y:", y_interp)
运行结果就会和你示例的结构一致:
自定义插值后的x: [7, 7.4, 7.7, 8, 8, 8, 8] 自定义插值后的y: [13. , 13.4, 13.7, 14. , 14. , 14. , 15. , 15. , 15. , 16. ]
额外说明
- 如果需要更平滑的插值效果(比如曲线过渡),可以把
interp1d的kind参数改成'quadratic'(二次插值)或者'cubic'(三次样条插值); - 如果你的数据量很大,建议用向量化操作代替循环,效率会更高,但上面的循环写法更直观,容易理解。
内容的提问来源于stack exchange,提问作者Alexandros Mel




