How to interpolate 2 dimensions of a 4D array ?

5 ビュー (過去 30 日間)
bhakti 2023 年 12 月 5 日
コメント済み: bhakti 2023 年 12 月 8 日
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 件のコメント
KALYAN ACHARJYA 2023 年 12 月 5 日
Please provide the array sizes [x,y,z,t]?
bhakti 2023 年 12 月 5 日
編集済み: bhakti 2023 年 12 月 5 日
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].



Torsten 2023 年 12 月 6 日
移動済み: Torsten 2023 年 12 月 6 日
% 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).';
  1 件のコメント
bhakti 2023 年 12 月 8 日
Thank you!


その他の回答 (2 件)

Sulaymon Eshkabilov
Sulaymon Eshkabilov 2023 年 12 月 5 日
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 件のコメント
Torsten 2023 年 12 月 6 日
And you want to compute velocity on a new grid for Longitude and Latitude with depth and time unchanged ?
bhakti 2023 年 12 月 6 日
Hello Torsten,
Thanks for your response.
Yes, that's what I am looking for.


Matt J
Matt J 2023 年 12 月 5 日
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 件のコメント
Matt J
Matt J 2023 年 12 月 6 日
I don't fully understand the question, but imresizen is doing interpolation, just as you requested.
bhakti 2023 年 12 月 8 日
Okay, I would try this.
Thank you.



Help Center および File ExchangeInterpolation についてさらに検索


Community Treasure Hunt

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

Start Hunting!

Translated by