Is there anyway to Re-grid one dataset to another dataset resolution without interpolating??
5 次查看(过去 30 天)
显示 更早的评论
Hey everyone, I have a geographical data (A) of dimension (120(lon) × 90(lat)) whose longitude (start=-178.5, end=178.5) resolution is 3 deg and for lat (start=-89, end=89) is 2 deg.I want to Re-grid this data to a different dimension of (720×360) (whose lat_start=-89.75,lat_end=89.75 and lon_start=-179.75, lon_end=179.75) whose lat and lon resolution is 0.5 deg without interpolating. Without interpolating means I want to put original data (A) every point to the closest of the new resolution (lat,lon), otherpoints I want to put zero or NaN. So the new matrix will have new dimension (720 × 360).
3 个评论
采纳的回答
Walter Roberson
2021-8-2
origLon=-178.5:3:178.5; origLat=-89:2:89;
norlon = length(origLon); norlat = length(origLat);
A = rand(norlon,norlat);
newLon=-179.75:0.25:179.75; newLat=-89.75:0.25:89.75;
nnlon = length(newLon); nnlat = length(newLat);
lonbin = interp1(newLon, 1:nnlon, origLon, 'nearest');
latbin = interp1(newLat, 1:nnlat, origLat, 'nearest');
lonbin(1:5), latbin(1:5)
B = nan(nnlon, nnlat);
B(lonbin, latbin) = A;
A(1:3,1:3)
B(1:20,1:20)
3 个评论
Walter Roberson
2021-8-3
编辑:Walter Roberson
2021-8-4
I do not interpolate the data: I interpolate indices. It is a method that works for regular rectangular grids, but does not require that the values in the source or destination are equally spaced, but does require that "nearest" in a dimension can be decided by referring to only that dimension. The interp1 code can be replaced with discretize() with some additional work to find the centers.
In the case where the spacing is guaranteed to be regular, the indices can be calculated more directly using rounding.
In your general case, what aspects will always be true, and what aspects can vary? For example if the grid spacings will always be what you show here but the grid boundaries could vary, then we might write optimal code differently than if the grid boundaries are fixed but the spacings might vary.
In your situation, is it certain to be true that intersections in the old grid will always map *exactly* to an intersection in the new grid? For example the spacing might be 4 times finer, but the edges have been choosen so that everything lines up? If so then the transfer can end up being simple.
更多回答(2 个)
John D'Errico
2021-8-3
编辑:John D'Errico
2021-8-3
What you are asking to do is arguably still "interpolation" of a sort. In fact, Walter''s use of nearest neighbor is quite reasonable.
At the same time, what you are asking to do is really laughably trivial to accomplish, just using a simple index rescaling. For example:
A = rand(4,3)
Now, suppose I want to "regrid" this onto a 9x7 grid, inserting NaNs wherever necessary.
OldSize = size(A);
NewSize = [9,7];
B = NaN(NewSize);
[indr,indc] = ndgrid(1:OldSize(1),1:OldSize(2));
% convert to the new indexing
indr = 1 + round((indr-1)*(NewSize(1)-1)/(OldSize(1)-1));
indc = 1 + round((indc-1)*(NewSize(2)-1)/(OldSize(2)-1));
B(sub2ind(NewSize,indr,indc)) = A
The result here is a bit coarse, with either 1 or 2 NaNs inserted in some rows as needed.
This will work of couse as long as the new grid is larger than the old one. If it was smaller, then you have a serious problem, one that cannot be resolved directly using any such scheme. But then you would need to decide what it means to regrid onto a smaller grid. You might decide to average elements that end up in the same boxes. This is itself doable, using tools like accumarray.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!