No jump in in if-query even though if-statement is true
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Stefanie Schwarz
am 12 Nov. 2019
Kommentiert: Stefanie Schwarz
am 15 Nov. 2019
In the following Code I want to compare the values of two different variables.
X = 0:0.1:200;
T = [0.1; 0.2; 0.3; 0.5; 0.9; 1.5; 2.6; 4.5; 7.7; 13.2; 22.8; 39.2; 67.5; 116.2; 200];
jump_in = zeros([length(T) 1]);
for t = 1:length(T)
for x = 1:length(X)
if X(x) == T(t)
jump_in(t) = 1;
break;
end
end
end
After running there are no warnings or errors but for the values of 0.3, 13.2 and 116.2 even if the statement is true it does not jump in.
I changed the if-statement into X(x) -T(t) == 0 but this did not work either.
I also changed the values of the Variables X and T into
X = [0.3:0.1:200];
T = [0.3; 0.5; 0.9; 1.5; 2.6; 4.5; 7.7; 13.2; 22.8; 39.2; 67.5; 116.2; 200];
Then it jumps into the if-query for 0.3 but it does not jump in for the vaules of 0.9, 1.5, 13.2 and 116.2.
Does someone has expierence with this problem or a hint?
My Matlab version is R2019a and I did not used any toolboxes or blocksets.
Thank you.
2 Kommentare
Stephen23
am 12 Nov. 2019
Bearbeitet: Stephen23
am 12 Nov. 2019
"Does someone has expierence with this problem or a hint?"
You are seeing some of the behaviors of floating point numbers, which can only represent approximations of some of those values. These behaviors are quite well documented:
This is worth reading as well:
Akzeptierte Antwort
Rik
am 12 Nov. 2019
Not all decimal numbers can be stored in binary as an exact value. This float rounding error can lead to situations like this. You can solve this by testing against a tolerance (functions like ismembertol and uniquetol are also useful).
If abs(X(x) -T(t)) <= eps
2 Kommentare
Rik
am 12 Nov. 2019
When using ismembertol, don't forget to set 'DataScale',1 because otherwise you might get unexpected results. Refer to the documentation to see if you want to leave the scaling on auto, or if you want to set it to 1.
As a side-note: I personally tend to use 2*eps, although there shouldn't really be a difference.
Glad to be of help.
Weitere Antworten (1)
Bhaskar R
am 12 Nov. 2019
I don't know,why are you taking variable jump_in.
From your code we can summarize as
% c- common values(X(x) == T(t))
% iX - indices if vector X
% iT - indices if vector T
[c, iX, iT] = intersect(X,T);
jump_in = ones(1, length(iX));
Correct me if I am wrong
Siehe auch
Kategorien
Mehr zu Matrix Indexing 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!