You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia中实现一维坐标不规则的二维插值可行吗?

在Julia中处理单坐标不规则的二维插值

你的场景属于非矩形结构化网格:y是规则的一维网格,但每个y值对应的x网格点不一致。传统的矩形网格插值工具(比如Dierckx的Spline2D、Interpolations包)确实不支持这类场景,因为它们要求输入是标准矩形网格——即x、y各自为一维数组,z为对应维度的矩阵,而你的x是每行对应不同y的不规则网格,不符合该要求。

解决方案:转换为散点插值

可以将所有(x,y,z)数据拆成散点集合,使用支持散点插值的包实现需求,以下是具体步骤:

1. 安装依赖包

using Pkg
Pkg.add("ScatteredInterpolation")

2. 转换数据为散点格式

把二维数组展开为三个一维数组,每个元素对应一个(x,y,z)点:

x = [0.5 2 3 4.;
     0.6 1 3 4.;
     0.7 2 3 5.;
     0.8 2 3 4.;]

y = [1; 2; 3; 4;]

z = [1. 2. 1. 2.;
     1. 2. 1. 2.;
     1. 2. 3. 2.;
     1. 2. 2. 2.;]

# 展开为散点数组
x_pts = vec(x)
y_pts = repeat(y, inner=size(x,2))  # 每个y值对应4个x点
z_pts = vec(z)

3. 创建插值器并执行插值

以Shepard插值(适合散点的平滑插值方法)为例:

using ScatteredInterpolation

# 创建插值器
interp = Interpolator(Shepard(), x_pts, y_pts, z_pts)

# 对任意目标点插值
z_new = interpolate(interp, 1.5, 2.5)

其他可选方案

如果需要更高精度的插值,可尝试先对散点做三角剖分再插值,比如使用DelaunayTriangulation.jl:

Pkg.add("DelaunayTriangulation")
using DelaunayTriangulation

# 构建三角剖分
tri = triangulate([x_pts y_pts])

# 实现线性插值函数
function linear_interp(tri, z_vals, x, y)
    idx, bary_coords = locate_point(tri, x, y)
    idx == 0 && return NaN  # 点在凸包外时返回NaN
    triangle_vertices = get_points(tri)[tri.triangles[idx]]
    return sum(bary_coords[i] * z_vals[triangle_vertices[i]] for i in 1:3)
end

# 执行插值
z_new = linear_interp(tri, z_pts, 1.5, 2.5)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:45:48