2017-08-29 88 views
2

我想插入一个M*N矩阵。例如,矩阵T表示温度,基质B代表的位置:2D矩阵的一维插值

T = [1 3 5; ... 
    2 4 6; ... 
    1 2 3]; 
B = [0.1 0.2 0.3; ... 
    0.1 0.2 0.3; ... 
    0.1 0.2 0.3]; 

我想获得在位置0.150.25温度信息。因此,矩阵B将是这样的:

New_B = [0.1 0.15 0.2 0.25 0.3; ... 
     0.1 0.15 0.2 0.25 0.3; ... 
     0.1 0.15 0.2 0.25 0.3]; 

和矩阵T预期的结果将是:

T = [1 2 3 4 5; ... 
    2 3 4 5 6; ... 
    1 1.5 2 2.5 3]; 

我想:

New_T = interp2(T, B, New_B); 

但它不工作。我如何做这个插值?

回答

2

您可以将interp1一个矩阵,在这种情况下,它会沿着每列运行。既然你想沿每一行插入,你将不得不输入transpose你的输入和输出。你也只需要每BNew_B一行:

New_T = interp1(B(1, :).', T.', New_B(1, :).').'; 

New_T = 

    1.0000 2.0000 3.0000 4.0000 5.0000 
    2.0000 3.0000 4.0000 5.0000 6.0000 
    1.0000 1.5000 2.0000 2.5000 3.0000 

如果你好奇,你就必须指定其他行网格点使用interp2

New_T = interp2(B(1, :), (1:size(B, 1)).', T, New_B(1, :), (1:size(New_B, 1)).'); 
2

您将不得不使用for循环,因为interp1仅适用于单行。

T=[ 1 3 5; 2 4 6; 1 2 3]; 
B=[0.1 0.2 0.3; 0.1 0.2 0.3; 0.1 0.2 0.3]; 


B_new = [0.1 0.15 0.2 0.25 0.3; 0.1 0.15 0.2 0.25 0.3; 0.1 0.15 0.2 0.25 0.3]; 

T_new = cell(2,1); 

for k=1:size(B,1) 

    T_new{k} = interp1(B(1,:),T(k,:),B_new(k,:)); 

end 

T_new = cell2mat(T_new) 

输出:

T_new = 

    1.0000 2.0000 3.0000 4.0000 5.0000 
    2.0000 3.0000 4.0000 5.0000 6.0000 
    1.0000 1.5000 2.0000 2.5000 3.0000 
+0

谢谢。我可以使用interp2吗?因为我有大量数据,Loop会杀死程序。 – Math

+1

interp2也假定第二维中的值之间也有关系。你可以通过预先声明一个矩阵而不是一个单元来快速地创建循环。 'T_new = nan(size(B_new))'和'T_new(k,:) = interp1(...'interp1非常快,我无法想象它会如何杀死程序。 – Gelliant