【问题标题】:Get interpolated 2D matrix by interpolating layers of 3D matrix in Matlab通过在 Matlab 中插值 3D 矩阵的层来获得插值的 2D 矩阵
【发布时间】:2019-05-09 15:19:17
【问题描述】:

我有一个这样定义的 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

返回

3.25         4.25         5.25
5.25         4.25         3.25
2.25         4.75         7.75

正如预期的那样。

【问题讨论】:

    标签: arrays matlab matrix interpolation


    【解决方案1】:

    您可以使用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)

    如果XqYqZq是不同方向的向量,那么XqYqZq在R中被视为网格向量3 .

    【讨论】:

    • 我不确定,但我认为您需要1:size(A,2), (1:size(A,1)).'(x 是第二个索引,y 是第一个)。
    【解决方案2】:

    内置函数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) 三元组进行评估。

    【讨论】:

    • 不要转置插值的输出,而是使用meshgrid,或者改变ndgrid的输入使其不转置:[XX,YY]=meshgrid(X,Y)[YY,XX]=ndgrid(Y,X)
    • 最初我使用 ndgrid 制作 3D XX、YY、ZZ 块,但我不需要它们。我一直很恼火 meshgrid 和 ndgrid 的方向不一样。
    • 确实,这很烦人。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2015-02-04
    • 1970-01-01
    • 2013-09-21
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多