problems with function "find". matlab doesn't match two numbere which are built equal

M cannot be found because Matlab says they are different, but i built them in order to be equal. length(data)=7155
clear all;clc;close all;
data0 = load('data0000.txt');
data1 = load('data0001.txt');
data2 = load('data0002.txt');
Rg=17.5;
fs = 100; % Hz
dt = 1/fs;
data= [data0; data1; data2];
time= 0:dt:(length(data)-1)*dt;
N=find(time==12.01);
M=find(time==46.5);
data=data(N:M,:);
time=time(N:M);

 채택된 답변

dt = 1/fs;
data= [data0; data1; data2];
time= 0:dt:(length(data)-1)*dt;
is the root of the problem; can be demonstrated without the other data files...
>> time= 0:dt:(7155-1)*dt; % build the time vector based on length and dt
>> find(time==46.5) % and look for exact match...
ans =
1×0 empty double row vector
>>
which fails. Huh!???!!! Whassup w/ that--
>> find(time>46.5,1) % ok where is value close to it?
ans =
4651
>> time(4650:4652) % see what look like, to four decimal points matches
ans =
46.4900 46.5000 46.5100
>> time(4651)==46.5 % is it really so or did something go wrong internally
ans =
logical
0
>> time(4651)-46.5 % what's the difference between what "looks like" match and target?
ans =
7.1054e-15
>>
It is close, but not exact.
This is floating point roundoff wherein the multiple application of the FP approximation to 1/100 is accrued in the computations and sometimes the calculated number is not quite the same as a value entered as text or computed by another technique not subject to the same rounding.
>> time=linspace(0,7154/100,7155);
>> t1= 0:dt:(7155-1)*dt;
>> all(t1==time)
ans =
logical
0
>> sum(t1==time)
ans =
3941
>> max(abs(t1-time))
ans =
1.4211e-14
>> find(time==46.5) % with |linspace|, don't see same rounding error
ans =
4651
>>
However, still is much more robust to use ismembertol when searching/matching for floating point values unless can explicitly control rounding.

댓글 수: 1

now it's clear! thank you very much, it seemed to me like black magic till now ahah

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

추가 답변 (1개)

jonas
jonas 2018년 10월 6일
편집: jonas 2018년 10월 6일
It is better to compare floats using a tolerance
tol=0.01;
M = find(abs(time-46.5)<tol);
I was however able to find the first number, N, using your code.
N =
1202
the second number, M, is probably in another textfile because there is no value near 46.5 in the one you attached

카테고리

도움말 센터File Exchange에서 Logical에 대해 자세히 알아보기

질문:

2018년 10월 6일

댓글:

2018년 10월 8일

Community Treasure Hunt

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

Start Hunting!

Translated by