通过在Matlab中内插3D矩阵的层来获得内插2D矩阵

时间:2019-05-09 15:19:17

标签: arrays matlab matrix interpolation

我有一个如下定义的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

符合预期。

2 个答案:

答案 0 :(得分:3)

您可以使用interp3,但是您的代码更清晰,甚至可能更快:

func fetchDevies() {
    let ref = Database.database().reference().child("some_node").child("Rooms")
    ref.observeSingleEvent(of: .value, with: { snapshot in
        let value = snapshot.value as? NSDictionary

        if let deviceRooms1 = value?["Rooms1"] as? String  {
            self.deviceRoom1 = deviceRooms1
        }
        .
        .
        .
        let items = [self.deviceRoom1, self.deviceRoom2, self.deviceRoom3, self.deviceRoom4, self.deviceRoom5]
        print(items)
    })

    //code here will run before Firebase has returned data and populated the vars

请注意,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); 的第二个和第三个参数是行向量和列向量。这会选择每个第3暗淡图层的所有值,因为从文档中可以找到

  

interp3

     

如果Vq = interp3(V,Xq,Yq,Zq)XqYq是不同方向的向量,则将ZqXqYq视为R 3 中的网格矢量。

答案 1 :(得分:3)

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