MATLAB Answers

Multiple griddata calls into a single one (same grid)

22 views (last 30 days)
Albert
Albert on 16 Apr 2021 at 16:17
Commented: Bruno Luong on 16 Apr 2021 at 19:09
Hi,
I'm using griddata to regrid points (xpoint, ypoint, pointval) into a regular grid (xgrid, ygrid). I used to do this in 2D as follows:
x = linspace(-1,1,200);
y = linspace(200,600,200);
[xgrid,ygrid] = meshgrid(x,y);
gridded = griddata(xpoint,ypoint,pointval,xgrid,ygrid,'v4');
But now I have expanded my analysis and I have different sets of points. All have the same (xpoint,ypoint) coordinates but different pointval. The straight way of doing this would be:
gridded = arrayfun(@(nn)griddata(xpoint,ypoint,pointval(:,nn),xgrid,ygrid,'v4'),1:npoints,'uniformoutput',false)
However this is effectively similar to a for loop and takes some time. Do you think there is a smarter way of calling griddata only once?
Thanks!

Answers (3)

Star Strider
Star Strider on 16 Apr 2021 at 16:41
The arrayfun function is significantly slower than an explicit loop, at least in my experience.
I would just do something like this:
for nn = 1:npoints
gridded{k} = griddata(xpoint,ypoint,pointval(:,nn),xgrid,ygrid,'v4');
end
I am sure there are applications where arrayfun is useful (perhaps with small arrays in anonymous functions), however llikely not here.
Also, the original arguments were (xpoint,xpoint). I changed them here to (xpoint,ypoint) since that also appears, so check that to be certain it is correct.
  4 Comments
Bruno Luong
Bruno Luong on 16 Apr 2021 at 19:09
IMO arrayfun is always slower than for-loop. It is just more visible when the unitary loop operation is fast. Here the interpolation is not fast so using arrayfun or for-loop doesn't matter speedwise.

Sign in to comment.


Bruno Luong
Bruno Luong on 16 Apr 2021 at 18:45
If you are ready to trade 'v4' method for something else, you can use scatteredInterpolant
% example of fake data
x = -3 + 6*rand(50,1);
y = -3 + 6*rand(50,1);
v = sin(x).^4 .* cos(y);
pointval = v + (0:10);
% fake grid
[xgrid,ygrid] = meshgrid(-3:0.1:3);
F = scatteredInterpolant(x,y,pointval(:,1));
F.Method = 'natural';
nv = size(pointval,2);
gridded = zeros([size(xgrid),nv]);
for k=1:size(pointval,2)
F.Values = pointval(:,k);
gridded(:,:,k) = F(xgrid,ygrid);
end
  1 Comment
Albert
Albert on 16 Apr 2021 at 18:56
I always had the impression that v4 performed best but takes more time. I can also use the former griddata function with the 'cubic' method and that's superfast too. Thanks!

Sign in to comment.


Bruno Luong
Bruno Luong on 16 Apr 2021 at 18:52
For nearest/linear/cubic method you can build the matrix https://www.mathworks.com/matlabcentral/fileexchange/85939-mat-op-ex, followed up from this thread
The output is simply matrix x vector of values, so you can multiply by many input vectors in one shot.

Community Treasure Hunt

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

Start Hunting!