为何Julia中findall函数在浮点矩阵中有时无法正常工作?
Julia中findall配合浮点数==匹配失效的原因
核心问题出在浮点数的精度特性,直接用==比较浮点数本身就不可靠,具体分析如下:
第一个示例失效的原因
rand()生成的是高精度的Float64类型数值,你看到的0.560603只是Julia控制台输出的近似截断值,矩阵中实际存储的是更长的精确小数(比如0.560603xxxxxx...)。- 你手动写的
x == 0.560603是在和一个截断后的近似值做比较,两个数值并不完全相等,因此findall找不到匹配项。
第二个示例成功的原因
- 创建
m2时,你直接使用了字面量8.1392,矩阵中存储的就是这个字面量对应的Float64值。后续用x == 8.1392比较时,两边是完全相同的浮点数,所以能精准匹配。
正确的处理方式
不要直接用==比较浮点数,改用近似比较或精确引用原始值:
- 使用
isapprox()函数设置误差范围进行匹配:findall(x -> isapprox(x, 0.560603; atol=1e-6), m) - 如果需要精确匹配,直接引用矩阵中的原始数值:
findall(==(m[1,1]), m)
内容的提问来源于stack exchange,提问作者imantha
相关产品推荐
相关产品推荐

