Searching vector for precision values
16 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Jacob Parmenter
am 4 Nov. 2021
Bearbeitet: Jacob Parmenter
am 4 Nov. 2021
There are many times where I have found myself searching a time vector for a specific time to offset data. Typically I use find(t == d) where d is a specific value which is known to be in t and t is a vector with length > 2000. However, for specific values of d (which I cannot understand) the boolean statement returns a zero vector (d not detected). For Example.
t = 1:1/400:10;
c = 5.465;
d = 5.565;
e = 5.665;
n = find(t == c);
m = find(t == d);
p = find(t == e);
produces n = 1787, m = null double vector, p = 1867.
and t(1827) = 5.5650
0 Kommentare
Akzeptierte Antwort
Dave B
am 4 Nov. 2021
Bearbeitet: Dave B
am 4 Nov. 2021
This is a common error with floating point precision, the numbers are not actually the same:
t = 1:1/400:10;
d = 5.565;
m = find(t == d)
[~,nearest]=min(abs(t-d));
t(nearest) % looks the same?
d==t(nearest) % but it isn't equal
d-t(nearest) % the values are ever so slightly different
% Here's the common workaround:
tol = 1e-10; %whatever is appropriate for your data
find(abs(t-d)<tol)
Here's a wikipedia about floating point error mitigation: https://en.wikipedia.org/wiki/Floating-point_error_mitigation
Here's a nice description about floating point from Cleve: https://blogs.mathworks.com/cleve/2014/07/07/floating-point-numbers/
If you search for "floating point error", or "floating point error matlab" you'll find lots more resources.
Note that there are a few functions in MATLAB that take a tolerance, like ismembertol but there's no isequaltol
0 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!