通过在 Matlab 中插值 3D 矩阵的层来获取插值的 2D 矩阵
Get interpolated 2D matrix by interpolating layers of 3D matrix in Matlab
我有一个这样定义的 3D 矩阵:
A = zeros(3,3,3)*3;
A(:,:,1) = [1 2 3; 3 2 1; 3 4 7];
A(:,:,2) = [4 5 6; 6 5 4; 2 5 8];
A(:,:,3) = [7 8 9; 9 8 7; 3 6 9];
我的目标是通过对 3D 矩阵的 2 个连续层进行插值来提取 2D 矩阵。在这个例子中,我希望矩阵在第 1 层和第 2 层之间的距离为 75%。我可以通过简单的线性插值来实现这一点,但我想获得一些更好、更智能的方法来执行此任务,也许可以利用内置 Matlab 函数。
l = 1; % Layer: 1<= l <= size(A,3)-1
x = 0.75; % Distance at which i want to interpolate from layer 0<= x <= 1
AMin = A(:,:,l);
AMax = A(:,:,l+1);
AMin + (AMax-AMin)*x
哪个returns
3.25 4.25 5.25
5.25 4.25 3.25
2.25 4.75 7.75
符合预期。
您可以使用 interp3
,但您的代码更清晰并且可能更快:
x = 1.75; % interpolate between 3rd-dim layers 1 and 2, closer to 2
result = interp3(A, 1:size(A,2), (1:size(A,1)).', x);
注意这里interp3
的第二个和第三个参数是行向量和列向量。这将选择每个 3rd-dim 层的所有值,因为根据文档,
Vq = interp3(V,Xq,Yq,Zq)
If Xq
, Yq
, and Zq
are vectors of different orientations, then Xq
, Yq
, and Zq
are treated as grid vectors in R3.
built-in 函数 interp3
可以满足您的需求。
A = zeros(3,3,3)*3;
A(:,:,1) = [1 2 3; 3 2 1; 3 4 7];
A(:,:,2) = [4 5 6; 6 5 4; 2 5 8];
A(:,:,3) = [7 8 9; 9 8 7; 3 6 9];
X = 0:size(A,1)-1;
Y = 0:size(A,2)-1;
[XX,YY] = meshgrid(X,Y); % 2D grid - so we can evaluate at many points
Target_Z = 0.75 * ones(size(XX));
OUT = interp3(X,Y,Z,A,XX,YY,Target_Z);
输出将是
OUT =
3.2500 5.2500 2.2500
4.2500 4.2500 4.7500
5.2500 3.2500 7.7500
当然,您不必选择规则的网格来评估此功能。您可以轻松地选择任何 (x,y,z) 三元组来评估。
我有一个这样定义的 3D 矩阵:
A = zeros(3,3,3)*3;
A(:,:,1) = [1 2 3; 3 2 1; 3 4 7];
A(:,:,2) = [4 5 6; 6 5 4; 2 5 8];
A(:,:,3) = [7 8 9; 9 8 7; 3 6 9];
我的目标是通过对 3D 矩阵的 2 个连续层进行插值来提取 2D 矩阵。在这个例子中,我希望矩阵在第 1 层和第 2 层之间的距离为 75%。我可以通过简单的线性插值来实现这一点,但我想获得一些更好、更智能的方法来执行此任务,也许可以利用内置 Matlab 函数。
l = 1; % Layer: 1<= l <= size(A,3)-1
x = 0.75; % Distance at which i want to interpolate from layer 0<= x <= 1
AMin = A(:,:,l);
AMax = A(:,:,l+1);
AMin + (AMax-AMin)*x
哪个returns
3.25 4.25 5.25
5.25 4.25 3.25
2.25 4.75 7.75
符合预期。
您可以使用 interp3
,但您的代码更清晰并且可能更快:
x = 1.75; % interpolate between 3rd-dim layers 1 and 2, closer to 2
result = interp3(A, 1:size(A,2), (1:size(A,1)).', x);
注意这里interp3
的第二个和第三个参数是行向量和列向量。这将选择每个 3rd-dim 层的所有值,因为根据文档,
Vq = interp3(V,Xq,Yq,Zq)
If
Xq
,Yq
, andZq
are vectors of different orientations, thenXq
,Yq
, andZq
are treated as grid vectors in R3.
built-in 函数 interp3
可以满足您的需求。
A = zeros(3,3,3)*3;
A(:,:,1) = [1 2 3; 3 2 1; 3 4 7];
A(:,:,2) = [4 5 6; 6 5 4; 2 5 8];
A(:,:,3) = [7 8 9; 9 8 7; 3 6 9];
X = 0:size(A,1)-1;
Y = 0:size(A,2)-1;
[XX,YY] = meshgrid(X,Y); % 2D grid - so we can evaluate at many points
Target_Z = 0.75 * ones(size(XX));
OUT = interp3(X,Y,Z,A,XX,YY,Target_Z);
输出将是
OUT =
3.2500 5.2500 2.2500
4.2500 4.2500 4.7500
5.2500 3.2500 7.7500
当然,您不必选择规则的网格来评估此功能。您可以轻松地选择任何 (x,y,z) 三元组来评估。