How to interpolate 2 dimensions of a 4D array ?

I have a 4D array which represents velocity(ocean currents) in a region, and I have to interpolate it to a different size.
Some insights on data;
1) Variables of 4 D array are (Longitude, latitude, depth, time).
2) Size of the array is [176,239,5,248]. I have to change/interpolate the size of array to [112,152,5,248]. Can someone please help in making the above said change(s)?
This is link to data file.
Thanks in advance!

4 Comments

On what basis is the change to be made?
Hello Dyuman Joshi,
Thanks for your response.
Preferably, any linear regridding options.
Please provide the array sizes [x,y,z,t]?
bhakti
bhakti on 5 Dec 2023
Edited: bhakti on 5 Dec 2023
Hello Kalyan,
Thanks for your response.
Size of the array is [176,239,5,248] and it has to be changed/interpolated to [112,152,5,248].

Sign in to comment.

 Accepted Answer

% Generate artificial data in longitude and latitude (176 points resp. 239
% points)
longdata = linspace(0,2,176);
latdata = linspace(0,5,239);
veldata = rand(numel(longdata),numel(latdata),5,248);
% Prescribe new grid in longitude and latitude direction (112 points resp.
% 152 points)
longdata_new = linspace(0,2,112);
latdata_new = linspace(0,5,152);
% Build new grid
[longq,latq] = meshgrid(longdata_new,latdata_new);
% Compute new velocity data
veldata_new = zeros(numel(longdata_new),numel(latdata_new),5,248);
for iz = 1:5
for it = 1:248
veldata_cut = veldata(:,:,iz,it);
veldata_new(:,:,iz,it) = interp2(longdata,latdata,veldata_cut.',longq,latq).';
end
end

More Answers (2)

Your data size is [176 238 5 248] and not [176,239,40,248].
In this case, interpolate your multi-D data, griddatan() to be used: DOC

5 Comments

I apologize, I must have pinned the wrong file.
The dependent variable that you want to interpolate with respect to (Longitude, latitude, depth, time) is missing.
The variable is velocity(ocean currents) as mentioned.
Velocity is represented on a grid ( Longitude, latitude, depth) at different instants of (time).
And you want to compute velocity on a new grid for Longitude and Latitude with depth and time unchanged ?
Hello Torsten,
Thanks for your response.
Yes, that's what I am looking for.

Sign in to comment.

You can use imresizen, to be downloaded from
A= rand([176,239,5,248]);
B=imresizen(A, [112,152,5,248]./[176,239,5,248]);
whos A B
Name Size Bytes Class Attributes A 176x239x5x248 417274880 double B 112x152x5x248 168878080 double

3 Comments

Hello Matt,
Thanks for your response.
Am I allowed to as a substandard question? I might be wrong but is the usage of 'imresize' in this case contextually correct even though technically interpolation and imresize might be based off the same principles?
I don't fully understand the question, but imresizen is doing interpolation, just as you requested.
Okay, I would try this.
Thank you.

Sign in to comment.

Categories

Find more on Interpolation in Help Center and File Exchange

Asked:

on 5 Dec 2023

Commented:

on 8 Dec 2023

Community Treasure Hunt

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

Start Hunting!