필터 지우기
필터 지우기

'Find' command to find index of lat and long from an array

조회 수: 19 (최근 30일)
Faisal Baig
Faisal Baig 2022년 5월 30일
댓글: Faisal Baig 2022년 5월 30일
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.

채택된 답변

KSSV
KSSV 2022년 5월 30일
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
KSSV
KSSV 2022년 5월 30일
Ohh yes...@Walter Roberson. I missed the output is an logical array.
Faisal Baig
Faisal Baig 2022년 5월 30일
Thanx alot, It solved my issue.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Walter Roberson
Walter Roberson 2022년 5월 30일
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.
  댓글 수: 1
Faisal Baig
Faisal Baig 2022년 5월 30일
Yes, I understand that point. I've also given the exact matched values as my desired numbers after looking in the array for entire globe, still its not working.

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

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

Start Hunting!

Translated by