Finding array index for a given array element does not work all the time
4 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Anders Tagmose Lundsfryd
el 1 de Mzo. de 2024
Comentada: Stephen23
el 1 de Mzo. de 2024
Hello,
I've been using the find(ismemeber()) function to find the index of an array element, however it does not work all the time for some reason. As you can see from the picture, it returns and empty vector at some given search values. As it can be seen from the array, it should return 393 for the last line of code. I am using the latest installation of matlab at the time of writting (2023b update 7).
To me this looks like a bug with the ismemeber() function, as it returns a false for the second entry(0.3920) but not the first entry(0.3910), se last two lines of code below. However, it could just be that i am doing something wrong? As I construct the array with a start, end, and stepsize, it shouldn't be a round of error?
Best regards Anders
mf = 0:0.001:0.6;
find(ismember(mf,0.3910))
find(ismember(mf,0.3920))
any(ismember(mf,0.3910))
any(ismember(mf,0.3920))
1 comentario
Stephen23
el 1 de Mzo. de 2024
"To me this looks like a bug with the ismemeber() function"
Nope.
"However, it could just be that i am doing something wrong?"
Yes. You are performing different operations on some binary floating point numbers and are then incorrectly assuming that these will produce exactly the same values. However that is not the case.
This is a completely expected result with binary floating point numbers:
This is worth reading as well:
Respuesta aceptada
Dyuman Joshi
el 1 de Mzo. de 2024
Welcome to the world of floating point numbers, where not all numbers can be represented exactly in binary form.
See this thread for more information - https://in.mathworks.com/matlabcentral/answers/57444-why-is-0-3-0-2-0-1-not-equal-to-zero?s_tid=faqs_link
When comparing floating point numbers, the best practice is to use a tolerance -
mf = 0:0.001:0.6;
val = 0.3910;
tol = 1e-6;
idx1 = find(abs(mf - val) < tol)
out = ismembertol(mf,val);
idx2 = find(out)
Más respuestas (1)
Chunru
el 1 de Mzo. de 2024
Mind the round off error in searching double array
mf = 0:0.001:0.6;
i = find(abs(mf - 0.3910) < 1e-6)
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!