mldmnn
mldmnn

Reputation: 139

Interpolate matrices for different times in Matlab

I have computed variables stored in a matrix for a specific time vector. Now I want to interpolate between those whole matrices for a new time vector to get the matrices for the desired new time vector.

I've came up with the following solution but it seems clunky and computational demanding:

clear all;

a(:,:,1) = [1 1 1;2 2 2;3 3 3]; % Matrix 1
a(:,:,2) = [4 4 4;6 6 6;8 8 8]; % Matrix 2

t1 = [1 2]; % Old time vector

t2 = [1 1.5 2]; % New time vector

% Interpolation for each matrix element
for r = 1:1:size(a,2)
for c = 1:1:size(a,1)
tab(:) = a(r,c,:);
tabInterp(r,c,:) = interp1(t1,tab(:),t2);
end
end

The result is and should be:

[2.5000    2.5000    2.5000
    4.0000    4.0000    4.0000
    5.5000    5.5000    5.5000]

Any thoughts?

Upvotes: 2

Views: 145

Answers (2)

Wolfie
Wolfie

Reputation: 30165

You can do the linear interpolation manually, and all at once...

m = ( t2 - t1(1) ) / ( t1(2) - t1(1) );  
% Linear interpolation using the standard 'y = m*x + c' linear structure
tabInterp = reshape(m,1,1,[]) .* (a(:,:,2)-a(:,:,1)) + a(:,:,1);

This will work for any size t2, as long as t1 has 2 elements.

If you have a t1 with more than 2 elements, you can create the scaling vector m using interp1. This is relatively efficient because you're only using interp1 for your time vector, not the matrix:

m = interp1( t1, (t1-min(t1))/(max(t1)-min(t1)), t2, 'linear', 'extrap' );

This uses implicit expansion with the .* operation, which requires R2016b or newer. If you have an older MATLAB version then use bsxfun for the same functionality.

Upvotes: 2

jodag
jodag

Reputation: 22304

I don't really see a problem with a loop based approach, but if you're looking for a loopless method you can do the following.

[rows, cols, ~] = size(a);
aReshape = reshape(a, rows*cols, []).';
tabInterp = reshape(interp1(t1, aReshape, t2).', rows, cols, []);

Looking at the source code for interp1 it appears a for loop is being used anyway so I doubt this will result in any performance gain.

Upvotes: 1

Related Questions