'Find' command to find index of lat and long from an array
3 views (last 30 days)
Show older comments
I am trying to extract the index of latitude and longitude from an array using 'find' command. My lat/long array contains latitude and longitude for the whole globe. I am using a code where I require only couple of lat/longs to be matched from the global array but its showing me that there is no match. Below is the code if anybody can help:
LG=[52.25 53.25 54.25]; % desired longitude values
LT=[21.65 22.65 23.65]; % desired latitude values
% Step 2 : Display all varaibles in nc file using command: ncdisplay
filename='3B-DAY.MS.MRG.3IMERG.20180203-S000000-E235959.V06.nc4'
ncdisp(filename,'/','min')
% Step 3 : Read varaibles from nc file by command : ncread
%Variable=input('write your main variable=');
precip=ncread(filename,'precipitationCal');
long=ncread(filename,'lon');
lat=ncread(filename,'lat');
time=ncread(filename,'time');
% Step 4 : Find index of longitude and latitude in the dimension of array
% using command : find
for i=1:3
LGG=find(long == LG(i));
LTT=find(lat == LT(i));
if isempty(LGG)||isempty(LTT)
disp('NaN')
break
end
Here I get 'NAN' display. Can somebody tell where is the error? I have attached the nc file as well.
0 Comments
Accepted Answer
KSSV
on 30 May 2022
You should not use find. As lat, lon are floating point numbers using == will not work. You need to define a small tolerance value and check the difference.
tol = 10^-3 ;
for i=1:3
LGG=abs(long-LG(i))<tol;
LTT=abs(lat-LT(i))<tol;
if LGG || LTT % check this logic accordingly
disp('NaN')
break
end
end
You need not to use a loop. You can do this in one line.
Also have a look on knnsearch
5 Comments
More Answers (1)
Walter Roberson
on 30 May 2022
Your code assumes that exactly those latitudes and longitudes appear in the file. You are testing for bit-for-bit identical representations of numbers that binary floating point inherently cannot store the exact representation of. Binary floating point cannot represent 1/10 or 1/100 exactly so for example,
fprintf('%.999g\n', 21.65)
That would have to be the exact value stored in the file, not just something that rounded to the 21.65 to the nearest 1/100.
I suggest that you use interp2() instead of looking for exact equality.
See Also
Categories
Find more on NetCDF 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!