Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

interpn

ndgrid 格式的一维、二维、三维和 N 维网格数据的插值

说明

示例

Vq = interpn(X1,X2,...,Xn,V,Xq1,Xq2,...,Xqn) 使用线性插值返回 n 变量函数在特定查询点的插入值。结果始终穿过函数的原始采样。X1,X2,...,Xn 包含样本点的坐标。V 包含各样本点处的对应函数值。Xq1,Xq2,...,Xqn 包含查询点的坐标。

Vq = interpn(V,Xq1,Xq2,...,Xqn) 假定一个默认的样本点网格。默认网格的每个维度均包含点 1,2,3,...ni。ni 的值为 V 中第 i 个维度的长度。如果您希望节省内存且不在意点之间的绝对距离,则可使用此语法。

Vq = interpn(V) 将每个维度上样本值之间的间隔分割一次,形成细化网格,并基于该网格上返回插入值。

示例

Vq = interpn(V,k) 将每个维度上样本值之间的间隔反复分割 k 次,形成细化网格,并基于该网格上返回插入值。这将在样本值之间生成 2^k-1 个插值点。

示例

Vq = interpn(___,method) 指定备选插值方法:'linear''nearest''pchip''cubic''makima''spline'。默认方法为 'linear'

示例

Vq = interpn(___,method,extrapval) 还指定标量值 extrapval,此参数会为处于样本点域范围外的所有查询点赋予该标量值。

如果您为样本点域范围外的查询省略 extrapval 参量,则基于 method 参量,interpn 返回下列值之一:

  • 对于 'spline''makima' 方法,返回外插值

  • 对于其他内插方法,返回 NaN

示例

全部折叠

定义样本点和值。

x = [1 2 3 4 5];
v = [12 16 31 10 6];

定义查询点 xq 并插值。

xq = (1:0.1:5);
vq = interpn(x,v,xq,'cubic');

绘制结果。

figure
plot(x,v,'o',xq,vq,'-');
legend('Samples','Cubic Interpolation');

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Samples, Cubic Interpolation.

创建一组一维网格点和对应的样本值。

[X1,X2] = ndgrid((-5:1:5));
R = sqrt(X1.^2 + X2.^2)+ eps;
V = sin(R)./(R);

使用 ntimes=1 在更精细的网格上插值。

Vq = interpn(V,'cubic');
mesh(Vq);

Figure contains an axes object. The axes object contains an object of type surface.

使用 ndgrid 创建一个二维采样点网格。

[x,y] = ndgrid(0:10,0:5);

在采样点处创建两组不同采样值,并将它们串联成三维数组中的页。绘制两组采样值对采样点的图。由于 surf 对网格使用 meshgrid 格式,需要转置输入以进行绘图。

v1 = sin(x.*y)./(x+1);
v2 = x.*erf(y);
V = cat(3,v1,v2);
tiledlayout(1,2)
nexttile
surf(x',y',V(:,:,1)')
view(2)
nexttile
surf(x',y',V(:,:,2)')
view(2)

Figure contains 2 axes objects. Axes object 1 contains an object of type surface. Axes object 2 contains an object of type surface.

使用 ndgrid 创建一组用于插值的查询点,然后使用 interpn 求出每个函数在查询点处的值。绘制插值对查询点的图。

[xq,yq] = ndgrid(0:0.2:10);
Vq = interpn(x,y,V,xq,yq);
tiledlayout(1,2)
nexttile
surf(xq',yq',Vq(:,:,1)')
view(2)
nexttile
surf(xq',yq',Vq(:,:,2)')
view(2)

Figure contains 2 axes objects. Axes object 1 contains an object of type surface. Axes object 2 contains an object of type surface.

创建网格向量 x1x2x3。这些向量用于定义与 V 中的值关联的点。

x1 = 1:100;
x2 = 1:50;
x3 = 1:30;

将采样值定义为一个 100×50×30 随机数数组 V

rng default
V = rand(100,50,30);

计算 x1x2x3 域范围外三个点处的 V。指定 extrapval = -1

xq1 = [0 0 0];
xq2 = [0 0 51];
xq3 = [0 101 102];
vq = interpn(x1,x2,x3,V,xq1,xq2,xq3,'linear',-1)
vq = 1×3

    -1    -1    -1

三个点计算得到的值均为 -1,因为它们位于 x1x2x3 域之外。

定义表示 $f = te^{-x^{2}-y^{2}-z^{2}}$ 的匿名函数。

f = @(x,y,z,t) t.*exp(-x.^2 - y.^2 - z.^2);

$R^4$ 中创建网格点。然后,将这些点全部传递给函数,以创建样本值 V

[x,y,z,t] = ndgrid(-1:0.2:1,-1:0.2:1,-1:0.2:1,0:2:10);
V = f(x,y,z,t);

现在创建查询网格。

[xq,yq,zq,tq] = ...
ndgrid(-1:0.05:1,-1:0.08:1,-1:0.05:1,0:0.5:10);

在查询点处进行 V 插值。

Vq = interpn(x,y,z,t,V,xq,yq,zq,tq);

创建影片以显示结果。

figure('renderer','zbuffer');
nframes = size(tq, 4);
for j = 1:nframes
   slice(yq(:,:,:,j),xq(:,:,:,j),zq(:,:,:,j),...
         Vq(:,:,:,j),0,0,0);
   clim([0 10]);
   M(j) = getframe;
end
movie(M);

输入参数

全部折叠

样本网格点,指定为实数数组或向量。样本网格点必须是唯一的。

示例: [X1,X2,X3,X4] = ndgrid(1:30,-10:10,1:5,10:13)

数据类型: single | double

样本值,指定为实数或复数数组。V 的大小要求取决于 X1,X2,...,Xn 定义的采样点网格的大小。采样点 X1,X2,...,Xn 可以是数组或网格向量,但在这两种情况下,它们都定义 n 维网格。V 必须为具有至少相同 n 个维度大小的数组,但它也可以具有超出 n 个维度的额外维度:

  • 如果 V 也有 n 个维度,则 V 的大小必须与 X1,X2,...,Xn 定义的 n 维网格的大小匹配。在本例中,V 在采样点处包含一组采样值。例如,如果 X1,X2,X3 是 3×3×3 数组,则 V 也可以是 3×3×3 数组。

  • 如果 V 的维数超过 n,则 V 的前 n 个维度必须与 X1,X2,...,Xn 定义的 n 维网格的大小匹配。V 中的额外维度定义采样点处的额外采样值集。例如,如果 X1,X2,X3 是 3×3×3 数组,则 V 可以是 3×3×3×2 数组以在采样点处定义两组采样值。

如果 V 包含复数,则 interpn 将分别对实部和虚部插值。

示例: rand(10,5,3,2)

数据类型: single | double
复数支持:

查询点,指定为实数标量、向量或数组。

  • 如果 Xq1,Xq2,...,Xqn 是标量,则为 Rn 中单个查询点的坐标。

  • 如果 Xq1,Xq2,...,Xqn 是方向不同的向量,则 Xq1,Xq2,...,Xqn 将被视作 Rn 中的网格向量。

  • 如果 Xq1,Xq2,...,Xqn 是大小和方向都相同的向量,则 Xq1,Xq2,...,Xqn 将被视作 Rn 中的散点。

  • 如果 Xq1,Xq2,...,Xqn 是大小相同的数组,则表示 Rn 中由查询点构成的一个完整网格(ndgrid 格式)或多个散点。

示例: [X1,X2,X3,X4] = ndgrid(1:10,1:5,7:9,10:11)

数据类型: single | double

细化因子,指定为非负实整数标量。此值指定对每个维度上网格点之间的间隔重复分割优化的次数。这将在样本值之间生成 2^k-1 个插值点。

如果 k0,则 VqV 相同。

interpn(V,1)interpn(V) 相同。

下面的插图描绘了在 R2 上,k=2 时的情形。共有 72 个插入值(以红色表示)和 9 个样本值(以黑色表示)。

Nine sample points in a grid with three interpolated points between the sample points in each dimension

示例: interpn(V,2)

数据类型: single | double

插值方法,指定为下表中的选项之一。

方法描述连续性注释
'linear'查询点处的插入值基于各维中邻近网格点处数值的线性插值。这是默认插值方法。C0
  • 每个维度需要至少两个网格点

  • 'nearest' 需要更多内存

'nearest'查询点处的插入值是距样本网格点最近的值。 不连续
  • 每个维度需要两个网格点。

  • 内存要求最低,计算速度最快

'pchip'保形分段三次插值(仅限一维)。查询点处的插入值基于邻近网格点处数值的保形分段三次插值。C1
  • 需要至少四个点

  • 'linear' 需要更多内存和计算时间

'cubic'查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于三次卷积。C1
  • 每个维度中的网格必须有均匀间距,但并非所有维度的网格间距都必须相同

  • 每个维度需要至少四个点

  • 'linear' 需要更多内存和计算时间

'makima'修正 Akima 三次 Hermite 插值。查询点的插入值使用次数最大为 3 的分段多项式函数基于各维中邻近网格点的值进行计算而得。为防过冲,已修正 Akima 公式。C1
  • 每一维需要至少 2 个点。

  • 产生的波动比 'spline'

  • 计算时间通常少于 'spline',但内存要求类似

'spline'查询点处的插入值基于各维中邻近网格点处数值的三次插值。插值基于使用非节点终止条件的三次样条。C2
  • 每个维度需要四个点

  • 'cubic' 需要更多内存和计算时间

X1,X2,...,Xn 域范围外的函数值,指定为实数或复数标量。interpnX1,X2,...,Xn 域范围外的所有点返回此常量值。

示例: 5

示例: 5+1i

数据类型: single | double
复数支持:

输出参量

全部折叠

插入的值,以实数或复数标量、向量或数组的形式返回。Vq 的大小和形状取决于所用的语法以及(某些情况下)输入参量的大小和值。

  • 如果用 X1,X2,...,Xn 指定采样点,或使用默认网格,并且 V 与采样点的 n 维网格具有相同的维数,则 Vq 包含由 Xq1,Xq2,...,Xqn 定义的查询点处的一组插值。

    • 如果 Xq1,Xq2,...,Xqn 是标量,则 Vq 是标量。

    • 如果 Xq1,Xq2,...,Xqn 是大小和方向相同的向量,则 Vq 是大小和方向相同的向量。

    • 如果 Xq1,Xq2,...,Xqn 是混合方向的网格向量,则 Vq 是与网格向量隐式定义的网格大小相同的数组。

    • 如果 Xq1,Xq2,...,Xqn 是大小相同的数组,则 Vq 是大小相同的数组。

  • 如果用 X1,X2,...,Xn 指定采样点,或使用默认网格,并且 V 的维数多于采样点的 n 维网格,则 Vq 包含由 Xq1,Xq2,...,Xqn 定义的查询点处的多组插值。在这种情况下,Vq 的前 n 个维度遵循上述单组插值的大小规则,但 Vq 也具有与 V 大小相同的额外维度。

  • 使用语法 interpn(V)interpn(V,k),插值是通过对默认网格进行 k 次细分来执行的(其中对于 interpn(V) 来说,k=1)。在这种情况下,Vq 是与 V 具有相同维数的数组,其中第 I 维的大小为 2^k * (size(V,i)-1)+1

详细信息

全部折叠

严格单调

一组始终递减或递增且无反转的值。例如,序列 a = [2 4 6 8] 便是一个严格单调递增的序列。序列 b = [2 4 4 6 8] 则非严格单调,因为 b(2)b(3) 之间的值无变化。而序列 c = [2 4 6 8 6]c(4)c(5) 之间包含反转,因此连单调序列也不是。

完整网格(ndgrid 格式)

interpn 而言,完整网格包含 n 个数组 X1,X2,...,Xn,其元素表示 Rn 中的网格点。第 i 个数组 Xi 包含沿第 i 个维度变化最快的严格单调递增值。

使用 ndgrid 函数创建可传递至 interpn 的完整网格。例如,以下代码便在 R2 中为区域 1 ≤ X1 ≤ 3、1≤ X2 ≤ 4 创建了一个完整网格。

[X1,X2] = ndgrid(-1:3,(1:4))
X1 =

    -1    -1    -1    -1
     0     0     0     0
     1     1     1     1
     2     2     2     2
     3     3     3     3


X2 =

     1     2     3     4
     1     2     3     4
     1     2     3     4
     1     2     3     4
     1     2     3     4

网格向量

interpn 而言,网格向量由 n 个具有混合方向的向量组成,这些向量用于定义 Rn 中的网格点。

例如,以下代码在 R3 中为区域 1 ≤ x1 ≤ 3、4 ≤ x2 ≤ 5 和 6 ≤x3≤ 8 创建网格向量:

x1 = 1:3;
x2 = (4:5)';
x3 = 6:8;

散点

interpn 而言,散点由 n 个定义 Rn 散点集合的数组或向量 Xq1,Xq2,...,Xqn 组成。第 i 个数组 Xi 包含第 i 个维度的坐标。

例如,以下代码指定 R3 中的点 (1, 19, 10)、(6, 40, 1)、(15, 33, 22) 和 (0, 61, 13)。

Xq1 = [1 6; 15 0];
Xq2 = [19 40; 33 61];
Xq3 = [10 1; 22 13];

扩展功能

版本历史记录

在 R2006a 之前推出

全部展开

另请参阅

| | |