How to interpolate matrix to get specific values

岁酱吖の 提交于 2021-01-28 05:34:54

问题


I have this matrix in MATLAB:

x = [NaN  -2   -1  0    1    2;
      1  0.21 0.15 0.34 0.11 0.32;
      2  0.14 0.10 0.16 0.31 0.11];

The first row represents the location of the values following X coordinates. I shift the first row by -0.63, so x becomes:

New_x = [NaN -2.63 -1.63 -0.63 0.37 1.37;
          1  0.21 0.15 0.34 0.11 0.32;
          2  0.14 0.10 0.16 0.31 0.11];

How can I use interpolation to get the values at specific coordinates of the New_x matrix that we have in the x matrix? ([-2 -1 0 1 2] points)

New_xInterp = [NaN -2.63 .. -2 .. -1.63 .. -1 .. -0.63 .. 0 .. 0.37 .. 1 .. 1.37 .. 2;
                1   0.21 ..  ? ..  0.15 ..  ? ..  0.34 .. ? .. 0.11 .. ? .. 0.32 .. ?;
                2   0.14 ..  ? ..  0.10 ..  ? ..  0.16 .. ? .. 0.31 .. ? .. 0.11 .. ?];

I want to get the '?' values. I tried to use interp2 function but I don't know which step or 2^k-1 interpolated points between coordinates values I have to have in order to get the points like -2, -1, 0, 1, 2.

Thanks !


回答1:


Since you do not have 2D data, you are only interpolating on one dimension, you only need the function interp1.

This function can work on vector or matrices if necessary, but it require a slight reorganisation of your data.

%% Input
M = [NaN  -2   -1  0    1    2;
      1  0.21 0.15 0.34 0.11 0.32;
      2  0.14 0.10 0.16 0.31 0.11];

%% Demultiplex inputs
x = M(1,2:end).' ;        % extract X values, reorder in column
y = M(2:end,2:end).' ;    % extract Y values, reorder in columns

%% Interpolate
xn = sort( [x-0.63 ; x] ) ;                         % Generate the new_x target values
yn = interp1( x-0.63 , y , xn ,'linear','extrap') ; % Interpolate the full matrix in one go

At this point you have your new xn and yn values in columns:

xn=         yn= 
-2.63       0.21    0.14
-2          0.1722  0.1148
-1.63       0.15    0.1
-1          0.2697  0.1378
-0.63       0.34    0.16
0           0.1951  0.2545
0.37        0.11    0.31
1           0.2423  0.184
1.37        0.32    0.11
2           0.4523  -0.016

I would keep them like that if you have more operations to do on them later on. However, if you want it back into the format you had at the beginning, we can simply rebuild the new full matrix:

%% Rebuild global matrix
Mout = [ M(:,1) , [xn.' ; yn.'] ] 

Mout =
NaN -2.63   -2      -1.63   -1      -0.63   0       0.37    1       1.37    2
1   0.21    0.1722  0.15    0.2697  0.34    0.1951  0.11    0.2423  0.32    0.4523
2   0.14    0.1148  0.1     0.1378  0.16    0.2545  0.31    0.184   0.11    -0.016



回答2:


Maybe you can try interp1 + arrayfun like below

r = sort([x(1,2:end),New_x(1,2:end)]);
New_xInterp = [New_x(:,1),cell2mat(arrayfun(@(k) interp1(New_x(1,2:end),New_x(k,2:end),r),1:size(New_x,1),'UniformOutput',false).')];

which gives

New_xInterp =

       NaN  -2.63000  -2.00000  -1.63000  -1.00000  -0.63000   0.00000   0.37000   1.00000   1.37000        NA
   1.00000   0.21000   0.17220   0.15000   0.26970   0.34000   0.19510   0.11000   0.24230   0.32000        NA
   2.00000   0.14000   0.11480   0.10000   0.13780   0.16000   0.25450   0.31000   0.18400   0.11000        NA

The code above used linear interpolation. If you want other options, you can type help interp1 to see more.



来源:https://stackoverflow.com/questions/61746455/how-to-interpolate-matrix-to-get-specific-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!