Juju
Juju

Reputation: 81

How to interpolate matrix to get specific values

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 !

Upvotes: 1

Views: 644

Answers (2)

Hoki
Hoki

Reputation: 11792

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

Upvotes: 1

ThomasIsCoding
ThomasIsCoding

Reputation: 101034

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.

Upvotes: 1

Related Questions