Borrar filtros
Borrar filtros

Implicit expansion for griddedInterpolant

5 visualizaciones (últimos 30 días)
Manuel Deuerling
Manuel Deuerling el 9 de Nov. de 2023
Comentada: Bruno Luong el 9 de Nov. de 2023
Hello,
I have to do a lot of interpolation on one data set and already found that griddedInterpolant is way faster than interp2;
It also allows element wise operation if two tensors of the same size are provided. As these are very big in my case, but repeat in some dimensions, I am wondering if something like implicit expansion (I hope I am using the correct terms here) can be used to speed up the code. Because for other functions using repmat is not advised.
Here I provide a minimum working example to show how I currently do it. Commented out are ways that I wish were possible to speed up the code but I can't get to run.
[X,Y] = ndgrid(0:10);
Z = rand([11,11]);
J = griddedInterpolant(X,Y,Z);
xq = sort(rand([4 1 3])*10);
yq = sort(rand([1 3 3])*10);
zq = J(repmat(xq,1,length(yq),1),repmat(yq,length(xq),1,1));
% zq = J(xq,yq); %implicit expansion?
% zq = bsxfun(@J,xq,yq);
% zq=J({xq,yq}) %Matt J's suggestion
If you have any input ( that can be generalized to different sizes of grids and lookups etc) I would be really thankful!
edit: changed xq, yq in the eaxmple to higher tensor to represent my problem more accurately

Respuesta aceptada

Matt J
Matt J el 9 de Nov. de 2023
Use the grid vector syntax of griddedInterpolant:
zq=J({xq,yq})
  5 comentarios
Manuel Deuerling
Manuel Deuerling el 9 de Nov. de 2023
@Matt J Yeah thats true. To be even more specific in my current problem it is like 100x1x100x100 and 1x100x1x100 so I would expect it to be useful. But this might change. So I guess there just isnt a generic solution I wished for. Thanks for the input I will work with that!
@Bruno Luong This actually seems to be faster. Not quite what i hoped for, as programming does not seem to be so clean (especially with multiple dimensions etc). But thanks too!
Bruno Luong
Bruno Luong el 9 de Nov. de 2023
Not too much messy with 4+D
zq = zeros(max(size(xq),size(yq)));
for k=1:size(zq(:,:,:),3)
zq(:,:,k) = J({squeeze(xq(:,:,k)),squeeze(yq(:,:,k))});
end

Iniciar sesión para comentar.

Más respuestas (1)

Bruno Luong
Bruno Luong el 9 de Nov. de 2023
  2 comentarios
Manuel Deuerling
Manuel Deuerling el 9 de Nov. de 2023
Thanks for the suggestion & link.
If there is no other solution I will try this. I dont expect that an implementation by me could beat an efficient MathWorks algorithm in terms of memory/speed usage but I should probably just listen to you and try it.
Bruno Luong
Bruno Luong el 9 de Nov. de 2023
It's probably depends on the size of your data. The strip down version like the one in this thread might beat TMW generic implementation.

Iniciar sesión para comentar.

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Productos


Versión

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by