Simultaneously interpolating over multiple rows of a matrix.

13 views (last 30 days)
I have a matrix ("mat") of size N*M where each row is defined over a grid ("grid"), and I would like to obtain interpolated values ("vals") over a subset of rows of length K ("ind1") over a query vector ("qvec"). This is part of a larger iterative routine, where the size and elements of ind1 and the elements of mat and qvec change each iteration. I'm currently using a for-loop over the subset of rows, interpolating one at time. Here is a simplified example:
K = length(ind1);
vals_temp = zeros(N,1);
for ii = 1:K
ind2 = ind1(ii);
vals_temp(ind2,1) = interp1(grid,mat(ind2,:),qvec(ind2));
end
vals = vals_temp(vals_temp>0);
I would like to be able to do this without a loop because this is very time consuming. I’m thinking that I can use interpn over the entire subset ind1, but I’m having trouble figuring out how to make the inputs conformable. Any help would be appreciated.

Accepted Answer

Matt J
Matt J on 7 Apr 2021
Edited: Matt J on 7 Apr 2021
This might be better,
e=1:K;
F=griddedInterpolant(mat(ind1,:),{e,grid});
vals_temp = F(e,qvec);
  2 Comments
Brandon
Brandon on 7 Apr 2021
I get this error:
Error using griddedInterpolant
Sample values must be of type double or single.
Brandon
Brandon on 7 Apr 2021
it appears the inputs to griddedInterpolant above are reversed:
F=griddedInterpolant({e,grid},mat(ind1,:));
Now there is about a 6% improvement in computational time. Thanks!

Sign in to comment.

More Answers (1)

Matt J
Matt J on 7 Apr 2021
Edited: Matt J on 7 Apr 2021
V=mat.';
vals_temp = interp1(grid,V(:,ind1),qvec);
  5 Comments
Matt J
Matt J on 7 Apr 2021
OK, but wait, now you're doing K^2 interpolation operations instead of K operations. Are you finding this to be faster regardless?
Brandon
Brandon on 7 Apr 2021
Computation time is actually about 5% longer. Any other suggestions?

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!