MATLAB - 三维数组插值



在 MATLAB 中,三维数组插值是指估计原始数据中未明确定义的点处的三维数组内的值。这对于创建更平滑的可视化效果或获取三维空间中中间点的值非常有用。

三维数组插值类似于二维数组插值,但扩展到第三维。它允许您估计数组中不是原始数据集一部分的点的值。

语法

Vq = interp3(X,Y,Z,V,Xq,Yq,Zq)
Vq = interp3(V,Xq,Yq,Zq)
Vq = interp3(V)
Vq = interp3(V,k)
Vq = interp3(___,method)

解释

上面提到的语法的详细解释:

Vq = interp3(X,Y,Z,V,Xq,Yq,Zq) - 此函数可帮助您估计三维网格点之间的值。您需要提供样本点的网格 (X, Y, Z) 及其对应的函数值 (V)。然后,它使用线性插值计算网格中其他点 (Xq, Yq, Zq) 处的函数值。新值始终落在原始网格上。

Vq = interp3(V,Xq,Yq,Zq) - 当您未指定样本点时,它会假设默认的样本点网格。此默认网格涵盖整个输入网格 V。当您想要节省内存并且不需要知道点之间确切距离时,这非常有用。

Vq = interp3(V) - 返回在更精细的网格上插值的值,该网格在每个维度上将样本值之间的区间细分为两部分。

Vq = interp3(V,k) - 通过在每个维度上重复细分区间 k 次,返回在更精细的网格上插值的值。这会在样本值之间创建 2^k-1 个插值点。

Vq = interp3(___,method) - 通过指定诸如 'linear'、'nearest'、'cubic'、'makima' 或 'spline' 之类的 method,您可以选择不同的方法来估计样本点之间的值。默认方法是 'linear'。

三维数组插值的示例

让我们尝试使用上面提到的语法进行一些关于三维数组插值的示例。

示例 1

以下是如何使用 Vq = interp3(X,Y,Z,V,Xq,Yq,Zq) 计算三维数组插值的示例:

[X, Y, Z] = meshgrid(1:5, 1:5, 1:5);
V = sin(X) .* cos(Y) .* exp(Z);

[Xq, Yq, Zq] = meshgrid(1:0.5:5, 1:0.5:5, 1:0.5:5);

Vq = interp3(X, Y, Z, V, Xq, Yq, Zq);

% Plot original and interpolated data
subplot(1, 2, 1);
slice(X, Y, Z, V, 3, 3, 3);
title('Original Data');

subplot(1, 2, 2);
slice(Xq, Yq, Zq, Vq, 3, 3, 3);
title('Interpolated Data');

在上面的示例中,我们有:

  • 我们首先使用 meshgrid() 创建样本点的三维网格 (X, Y, Z)。
  • 然后,我们使用一些数学表达式定义函数值 V。
  • 接下来,我们创建用于插值的更精细网格 (Xq, Yq, Zq)。
  • 使用 interp3(),我们使用线性插值对查询点 (Xq, Yq, Zq) 处的函数值 V 进行插值。
  • 最后,我们使用 slice() 函数绘制原始数据和插值数据,以可视化三维网格。

当代码在 matlab 命令窗口中执行时,输出为:

meshgrid

示例 2

以下是如何使用 Vq = interp3(V,Xq,Yq,Zq) 计算三维数组插值的示例:

[X, Y, Z] = meshgrid(1:5, 1:5, 1:5);
V = X + Y + Z; % Sample function (sum of coordinates)

[Xq, Yq, Zq] = meshgrid(1:0.5:5, 1:0.5:5, 1:0.5:5);

% Interpolate
Vq = interp3(X, Y, Z, V, Xq, Yq, Zq);

% Plotting
figure;
slice(X, Y, Z, V, [1, 3, 5], [1, 3, 5], [1, 3, 5]); % Original data
hold on;
slice(Xq, Yq, Zq, Vq, [1, 3, 5], [1, 3, 5], [1, 3, 5]); % Interpolated data
hold off;
xlabel('X-axis');
ylabel('Y-axis');
zlabel('Z-axis');
legend('Original Data', 'Interpolated Data');
title('Interpolation in a 3D Grid');

在上面的示例中,我们有:

  • 我们首先使用 meshgrid 函数创建一个三维网格 V。此网格表示一个简单的函数,其中每个点的值都是其 X、Y 和 Z 坐标的总和。这只是一个用于演示目的的示例函数。
  • 然后,我们使用 meshgrid 创建查询点的更精细网格 (Xq, Yq, Zq)。这些点是我们想要插值值的位置。
  • 使用 interp3 函数,我们根据原始网格 (V) 中的值对查询点 (Xq, Yq, Zq) 处的值进行插值。
  • 我们使用 slice 函数在三维网格中可视化原始数据 (V) 和插值数据 (Vq)。slice 函数会穿过体数据创建切片平面,并在单个图形中显示它们。

代码执行后,我们得到的输出如下:

3d array interpolation

示例 3

以下是如何使用 Vq = interp3(V) 计算三维数组插值的示例:

V = zeros(5, 5, 5);
V(3, 3, 3) = 1; 

% Perform 3D interpolation
Vq = interp3(V);

% Plotting
figure;
subplot(1, 2, 1);
slice(V, 3, 3, 3); % Original grid
title('Original Grid');
xlabel('X'); ylabel('Y'); zlabel('Z');

subplot(1, 2, 2);
slice(Vq, 3, 3, 3); % Interpolated grid
title('Interpolated Grid');
xlabel('X'); ylabel('Y'); zlabel('Z');

在上面的示例中,我们有:

  • 我们创建一个 5x5x5 的数组 V,所有元素都初始化为零,除了索引 (3, 3, 3) 处的元素设置为 1。
  • 然后调用 interp3(V) 函数,该函数会对三维数组 V 进行插值以估计现有点之间的值。
  • 我们使用 slice 来可视化沿每个维度 (X、Y、Z) 以索引 (3、3、3) 为中心的原始和插值网格。插值网格显示如何在原始网格的点之间估计值。

代码执行后,我们得到的输出如下:

interpolation

示例 4

以下是如何使用 Vq = interp3(V,k) 计算三维数组插值的示例:

[X, Y, Z] = meshgrid(1:5, 1:5, 1:5);
V = sin(X) .* cos(Y) .* Z;

k = 2; % Halve the intervals twice in each dimension
Vq = interp3(V, k);

% Plotting
figure;
subplot(1, 2, 1);
slice(V, 3, 3, 3); % Original grid
title('Original Grid');
xlabel('X'); ylabel('Y'); zlabel('Z');

subplot(1, 2, 2);
slice(Vq, 3, 3, 3); % Interpolated grid
title('Interpolated Grid (k=2)');
xlabel('X'); ylabel('Y'); zlabel('Z');

在上面的示例中,我们有:

  • 我们使用 meshgrid 创建一个三维数组 V,并根据 sin、cos 和 meshgrid 坐标的函数填充它。
  • 然后调用 interp3(V, k) 函数,其中 k=2,这意味着我们想要在每个维度上将区间一分为二两次,从而得到一个更精细的网格。
  • 我们使用 slice 来可视化沿每个维度 (X、Y、Z) 以索引 (3、3、3) 为中心的原始和插值网格。插值网格显示如何在原始网格的点之间以更高的分辨率估计值。

代码执行后,我们得到的输出如下:

intervals twice

示例 5

以下是如何使用 Vq = interp3(___,method) spline 方法计算三维数组插值的示例:

[X, Y, Z] = meshgrid(1:5, 1:5, 1:5);
V = sin(X) .* cos(Y) .* Z;

Vq = interp3(V, 'spline');

% Plotting
figure;
subplot(1, 2, 1);
slice(V, 3, 3, 3); % Original grid
title('Original Grid');
xlabel('X'); ylabel('Y'); zlabel('Z');

subplot(1, 2, 2);
slice(Vq, 3, 3, 3); % Interpolated grid using 'spline' method
title('Interpolated Grid (Method: spline)');
xlabel('X'); ylabel('Y'); zlabel('Z');

在上面的示例中,我们有:

  • 我们使用 meshgrid 创建一个三维数组 V,并根据 sin、cos 和 meshgrid 坐标的函数填充它。
  • 然后调用 interp3(V, 'spline') 函数,指定 'spline' 方法进行插值。此方法使用样条插值来估计原始网格点之间的值。
  • 我们使用 slice 来可视化沿每个维度 (X、Y、Z) 以索引 (3、3、3) 为中心的原始和插值网格。'spline' 方法在原始网格的点之间提供了平滑的插值。

代码执行后,我们得到的输出如下:

spline method

示例 6

以下是如何使用三次方法计算三维数组插值的示例:

[X, Y, Z] = meshgrid(-2:2, -2:2, -2:2);
V = X.^2 + Y.^2 + Z.^2;

% Define the query points
[Xq, Yq, Zq] = meshgrid(-2:0.5:2, -2:0.5:2, -2:0.5:2);

% Perform 3D array interpolation using the cubic method
Vq = interp3(X, Y, Z, V, Xq, Yq, Zq, 'cubic');

% Plot the original and interpolated data
figure;
scatter3(X(:), Y(:), Z(:), 100, V(:), 'filled');
hold on;
scatter3(Xq(:), Yq(:), Zq(:), 100, Vq(:), 'filled');
legend('Original Points', 'Interpolated Points');
title('3D Array Interpolation using Cubic Method');
xlabel('X');
ylabel('Y');
zlabel('Z');

在上面的示例中,我们有:

  • 我们使用 meshgrid 创建一个三维数组 V 来表示三维函数。
  • 使用 meshgrid 定义一组新的查询点 Xq、Yq 和 Zq,以指定我们想要进行插值的位置。
  • 使用三次方法的 interp3 进行插值。
  • 使用 scatter3 绘制 V 中的原始点和 Vq 中的插值点,以可视化插值过程。

代码执行后,我们得到:

cubic method
广告
© . All rights reserved.