Filter löschen
Filter löschen

2d interpolation from a non-uniform grid

160 Ansichten (letzte 30 Tage)
oceanmod
oceanmod am 24 Jun. 2020
Kommentiert: Akira Agata am 26 Jun. 2020
I have looked at the griddata function but am not clear if it applies to data on an irregular mesh. In my case, I have a 2d spatial dataset available on an [X,Y] grid where X and Y, which are the cartesian coordinates, are themselves 2d arrays. That is, both X and Y have sizes (m,n) but
X(:,1) ~= X(:,2) ~= X(:,3) and so on.
Similarly for the array Y. Visually, you can picturize the grid as follows, where X marks the location of the input data set:
X X X X
X X X X
X X X X
Along each row, the spacing between two Xs is uniform. But the spacing changes from row to row, leading to X(:,1), X(:,2), etc. all being different.
It looks like griddata will not accept such an input grid. Am I correct?
Thanks for your help.
  4 Kommentare
oceanmod
oceanmod am 25 Jun. 2020
Hmm... scatteredInterpolant is not working either as that is also expecting "a double array" but I am trying to feed in 2-d arrays for the first and second arguments (x and y below) in
F = scatteredInterpolant(x,y,V)
There must be a way to do this in Matlab:) I am sure I am not the first to have data on a grid where both the x and y coordinate vary with (i,j).
Akira Agata
Akira Agata am 26 Jun. 2020
Well, let me clarify my intention by the following small example.
I hope this will be somehow helpful for you to understand how these two functions works.
% Original Data (X and Y are non-uniform grid)
X = [...
1 3 5 7;...
2 4 6 8;...
1 3 5 7;...
2 4 6 8];
Y = [...
1 1 1 1;
2 2 2 2;
3 3 3 3;
4 4 4 4];
Z = X.^2 + Y.^2;
% Query points
[xGrid, yGrid] = meshgrid(1:0.2:8,1:0.2:4);
% [Solution 1]
F = scatteredInterpolant(X(:),Y(:),Z(:));
zGrid = F(xGrid,yGrid);
% [Solution 2]
X2 = X(1:2:end,:);
Y2 = Y(1:2:end,:);
Z2 = Z(1:2:end,:);
zGrid2 = interp2(X2,Y2,Z2,xGrid,yGrid);

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Bjorn Gustavsson
Bjorn Gustavsson am 25 Jun. 2020
No you can use griddata and scatteredInterpolant. You can do something like this:
Zi = griddata(X(:),Y(:),Z(:),Xi,Yi);
And you do the same thing with scatteredInterpolant - the (:) construct just unwraps an array into a 1-D column array.
HTH
  3 Kommentare
Bjorn Gustavsson
Bjorn Gustavsson am 25 Jun. 2020
Yes it does:
[X,Y] = meshgrid(1:12,1:11);
X(2:2:end,:) = X(2:2:end,:)+.5;
plot(X,Y,'+')
Z = peaks(12);
Z = Z(2:end,:);
subplot(1,2,1),
pcolor(X,Y,Z)
[Xi,Yi] = meshgrid(1:.1:12,1:.1:11);
Zi = griddata(X(:),Y(:),Z(:),Xi,Yi);
subplot(1,2,2)
pcolor(Xi,Yi,Zi),shading flat
You have to give the function the input it expects, for x, y and z. Then it demonstrably works.
oceanmod
oceanmod am 25 Jun. 2020
Bearbeitet: oceanmod am 25 Jun. 2020
Thanks for persisting! I understood what I was doing wrong. Once I use meshgrid to create [X,Y] at the beginning, I can then populate the values as I want, be they regularly spaced or not (as illustrated in your example). This is what I am doing now:
% xorig, yorig are the original 2d arrays describing the cartesian coordinates
[X,Y]=meshgrid(size(xorig,1),size(xorig,2));
for i=1:size(xorig,1);
for j=1:size(xorig,2);
X(j,i) = xorig(i,j);
Y(j,i) = yorig(i,j);
end
end
% x, y are the new locations where I want the interpolated values
[x,y] = meshgrid(-5:0.1:5, 5:0.1:5);
% The interpolation step (need to transpose the original field)
var_new = griddata(X,Y,var_old',x,y,'cubic');
I found that the mean value is changing at the second decimal after interpolation but that amount of interpolation error might be unavoidable.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Interpolation finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by