Error using interp3 "Error using griddedInterpolant. Grid arrays must have NDGRID structure"
25 views (last 30 days)
Show older comments
I am trying to interpolate observation heights from pressures in 3D space. I am using interp3 because it is generally faster than griddata, however I return this error, and I am not really sure what NDGRID structure means. I am running it in a loop as well. The following sizes of variables in interp3(X,Y,Z,V,Xq,Yq,Zq):
for ns=1:length(obs_is)
obs_hts(ns)=interp3(repmat(y_pts,[1 1 size(h,3)]),repmat(x_pts,[1 1 size(h,3)]),double(p),double(h),obs_lats(ns),obs_lons(ns),obs_pres(ns));
end
X: latitudes in 3D model space (199x199x50)
Y: longitudes in 3D model space (199x199x50)
Z: pressure in 3D model space (199x199x50)
V: heights in 3D model space (199x199x50)
Xq: observation latitude (scalar)
Vq: observation longitude (scalar)
Zq: observation pressure (scalar)
And yes, these are all double (not single) variables.
0 Comments
Answers (2)
Star Strider
on 27 Aug 2023
10 Comments
Walter Roberson
on 28 Aug 2023
interp3() has a try/catch that tests the error generated by griddedInterpolant() and conditionally substitutes a different error message referencing meshgrid(). But perhaps the error codes got updated while the interp3() error code test did not get updated?
Paul
on 28 Aug 2023
That sounds like an odd way to handle input argument checking to interp3. Seems like that should be done at the interp3 level before the call to griddedInterpolant.
At least calling interp3 with ndgrid inputs generates the expected error
[X,Y,Z] = ndgrid(1:4);
V = X + Y + Z;
interp3(X,Y,Z,V,1.5,2.5,3.5)
Bruno Luong
on 28 Aug 2023
Edited: Bruno Luong
on 29 Aug 2023
Check with this
for ns=1:length(obs_is)
X = repmat(y_pts,[1 1 size(h,3)]);
Y = repmat(x_pts,[1 1 size(h,3)]);
Z = double(p);
if ~all(X == X(1,:,1), 'all')
if all(X == X(:,1,1), 'all') && all(Y == Y(1,:,1), 'all')
warning('You might swap X and Y')
else
error('X for ns=%d X is not meshgrid generated', ns);
end
end
if ~all(Y == Y(:,1,1), 'all')
error('Y for ns=%d Y is not meshgrid generated', ns);
end
if ~all(Z == Z(1,1,:), 'all')
error('Z for ns=%d Z is not meshgrid generated', ns);
end
end
It allows to see further why your data is incorrectly gridded for interp3
0 Comments
See Also
Categories
Find more on Interpolation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!