No jump in in if-query even though if-statement is true
1 次查看(过去 30 天)
显示 更早的评论
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 个评论
Stephen23
2019-11-12
编辑:Stephen23
2019-11-12
"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:
采纳的回答
Rik
2019-11-12
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 个评论
Rik
2019-11-12
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.
更多回答(1 个)
Bhaskar R
2019-11-12
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
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!