MATLAB中arr==el为何有时无法找到数组元素?如何解决?
MATLAB浮点数查找问题:原因与解决方案
问题原因
这是浮点数精度误差导致的。0.1在二进制浮点数体系里是无限循环小数,MATLAB用双精度存储时只能存近似值。用-0.2:0.1:0.2生成数组时,元素数量少,累积的近似误差还没大到让数组里的"0.1"和直接写的0.1产生可被==检测到的差异;但-0.3:0.1:0.3生成数组时,多次累加近似的0.1后,数组里对应位置的实际存储值会变成类似0.10000000000000002的数,和字面量0.1严格相等的判断自然不成立,所以find(arr==0.1)返回空矩阵。
你可以直接验证:在命令行输入arr = -0.3:0.1:0.3; arr(5),能看到输出不是精确的0.1,而是带微小误差的近似值。
可靠生成与查找的方法
- 整数缩放法:先创建整数数组再除以缩放因子,彻底避免累加误差
arr = (-3:1:3)/10; % 生成-0.3到0.3、步长0.1的数组 el = 0.1; idx = find(arr == el); % 此时能正确得到idx=5 - linspace生成法:
linspace直接计算每个元素的位置,而非逐步累加步长,误差更小arr = linspace(-0.3, 0.3, 7); % 7个元素,步长恰好为0.1 el = 0.1; idx = find(arr == el); - 容差比较法:如果必须用冒号生成数组,放弃严格相等,改用容差匹配
arr = -0.3:0.1:0.3; el = 0.1; % 方式1:用ismembertol自动处理浮点数容差 [~, idx] = ismembertol(el, arr); % 方式2:手动设置极小容差进行比较 idx = find(abs(arr - el) < 1e-10);
内容的提问来源于stack exchange,提问作者SapereAude
相关产品推荐
相关产品推荐

