Interpolation of 3D arrays against a 1D vector

Hello all.
I have a video data represented as 3D matrix in the form of Data(x,y,t). Here, x,y represent the pixel number and t is the time. I have the time vector stored in a separate variable. I need to interpolate the variable Data at a new time vector represented by variable t_new to get the new variable Data_new(x,y,t_new). I am using the following code:
n = 20;
m = 60;
t = linspace(0,1,n)';
t_new = linspace(0,1,m)';
Data = rand(50,50,n);
Data_new = permute(interpn(t,permute(Data,[3 2 1]),t_new),[3 2 1]);
% Verification by plotting the time history of selected pixel:
x = 25;
y = 25;
plot(t,reshape(Data(x,y,:),n,1),t_new,reshape(Data_new(x,y,:),m,1))
It looks fine to me. but the main concerns I am asking about:
  1. I had to use permute twice. I am not able to do it without permute. Can I avoid this?
  2. Is there a faster method to perform this interpolation?
Thanks and best,
Ahmad

 Accepted Answer

Matt J
Matt J on 25 Aug 2022
Edited: Matt J on 25 Aug 2022
[Nx,Ny,~]=size(Data);
F=griddedInterpolant({1:Nx,1:Ny,t},Data);
Data_new=F({1:Nx,1:Ny,t_new});

2 Comments

Thank you very much for the prompt response. That is very helpful.
Can you tell me why griddedInterpolant is nearly 5-6 times faster than interpn? Thanks!

Sign in to comment.

More Answers (0)

Products

Release

R2021b

Asked:

on 25 Aug 2022

Commented:

on 25 Aug 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!