Why matrix return all 'false/0' when there are a lot of similar values between matrix and a column vector?

조회 수: 1 (최근 30일)
Hi all,
I have a text file which I imported in MATLAB and now it's in the form of table. It has latitude longitude values which I want to compare with other lat lon values. Data from text file is attached.
Secondly, there is a .hdf file containing lat lon values in the form of matrix. I used interpolation because size of column vector (to be matched) in text file is 7570x1. Initial size of lat lon from hdf image is:
%initial size
lat_hdf = 406x270
lon_hdf = 406x270
%interpolation
lat1 = imresize(lat_hdf,[7570 270],'bilinear');
lon1 = imresize(lon_hdf,[7570 270],'bilinear');
The problem is when I want to match the text file lat lon with lat1 and lon1 it returns a matrix with all 0. Means all false.
However there are alot of values that are similar in these two. I don't know what's the issue.

채택된 답변

KSSV
KSSV 2021년 9월 6일
You should not compare the floting point numbers like that. You should check the difference between them to be less than some tolerance.
tol = 10^-3 ;
Mat = (lat-lat_txt)<=tol;

추가 답변 (1개)

Walter Roberson
Walter Roberson 2021년 9월 6일
Mat = (lat1==lat_txt);
The == operator is only bit-for-bit identical values (except that -0 is considered to be equal to 0). But you did
lat1 = imresize(lat_hdf,[7570 270],'bilinear');
so the values in lat1 are computed values -- and they might only be "close", or they might have slightly different round-off in the last bit or two.
Never use == to compare for equality with computed floating point values, except for cases where the value being compared is extracted from the other value. For example it is valid to do
a = rand(1,10);
maxa = max(a);
a == maxa
because maxa will be a bit-for-bit equivalent to some value in a.
It is common to see people do things like
b = 0:.1:1;
b*10 == 3
and be surprised that it is not true for any positions in b. 0.1 is not exactly representable in double precision, and the : operator does not interpret the operation as requesting b = (0:10)/10
Anyhow, you should use ismembertol() instead of ==

카테고리

Help CenterFile Exchange에서 HDF5에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by