You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Matlab中基于已知向量点对插值生成N个中间点的实现问询

解决相邻点间插入N个插值点的问题

这事儿其实用线性插值就能轻松搞定,不管你要插2个还是N个点都通用!我给你用Python举个具体的实现例子,分两种场景:均匀插值(最常用)和自定义非均匀插值(匹配你示例里的非均匀点)。

方法一:均匀插值(用Numpy快速实现)

如果只需要在每对相邻点之间插入均匀分布的新点,用Numpy的linspace函数就足够了,步骤很清晰:

  1. 遍历每一对相邻的已知(x,y)点;
  2. 在每对点之间生成包含端点在内的N+2个点(这样刚好能得到N个中间插值点);
  3. 拼接所有段的时候,去掉每段的最后一个点(避免和下一段的起点重复),最后再补上原始数据的最后一个端点。

代码示例:

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. ]

额外说明

  • 如果需要更平滑的插值效果(比如曲线过渡),可以把interp1dkind参数改成'quadratic'(二次插值)或者'cubic'(三次样条插值);
  • 如果你的数据量很大,建议用向量化操作代替循环,效率会更高,但上面的循环写法更直观,容易理解。

内容的提问来源于stack exchange,提问作者Alexandros Mel

火山引擎 最新活动