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.