使用 Julia 将 in() 与元组数组一起使用时出错
Posted
技术标签:
【中文标题】使用 Julia 将 in() 与元组数组一起使用时出错【英文标题】:Error using in() with an array of tuples using Julia 【发布时间】:2018-12-24 07:06:55 【问题描述】:我有 2 个元组数组,我有一个循环询问一个元素是否在另一个元素中。 在每一步我都会询问坐标数组中包含的元组是否在 Y 数组中。该循环工作正常,除了一个我无法解释原因的元素。这是我所拥有的:
Y[55:65] # This is the array I want to check at each step if my state is in or not.
11 元素数组Any,1: (2.0, 1.0) (3.0, 1.0) (4.0, 1.0) (5.0, 1.0) (6.0, 1.0) (7.0, 1.0) (8.0, 1.0) (9.0, 1.0) (10.0, 1.0) (11.0, 1.0) (12.0, 1.0)
coord[i-1] # this is one element of coord that is in Y
0维数组TupleFloat64,Float64,0: (6.0, 1.0)
coord[i] # this is an other element of coord that is in Y
0维数组TupleFloat64,Float64,0: (7.0, 1.0)
但是当我测试它们在 Y 时:
in(coord[i],Y[55:65]) # testing if coord[i] is in Y
假
in(coord[i-1],Y[55:65]) # testing if coord[i-1] is in Y
是的
我不明白:它们在 Y 中都以相同的方式表示,它们具有相同的类型,为什么我使用 in() 得到一个在而不是另一个?
我使用 Julia 版本 0.6.3。
提前感谢您的帮助!
【问题讨论】:
很可能Y[55:65]
包含包装在 0 维数组中的 (7.0, 1.0)
,而 (6.0, 1.0)
未包装。它们以相同的方式打印,因此仅使用目视检查很难区分它们。但这可能是这种情况,因为Y[55:65]
是VectorAny
,所以它似乎包含混合类型。你能发布typeof.(Y[55:65])
的结果吗?
感谢您的帮助。 typeof.(Y[55:65])
给:11-element ArrayDataType,1: ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0 ArrayTupleFloat64,Float64,0
我找不到这两个有什么区别。
好像类型是一样的。那么Y[60] == coord[i]
比较返回什么?如果是false
,那么Y[60][][1] == coord[i][][1]
和Y[60][][2] == coord[i][][2]
会返回什么?如果这两个返回 false
中的任何一个,则实际上元组的条目不相等(如果您使用 Float64
可能会发生这种情况,因为四舍五入)。
感谢您的帮助,是的,我意识到这些值确实不完全相等,但机器精度不同。这很奇怪,因为我做了类似 7/100*100 的事情,我没想到会发生这种情况!谢谢
【参考方案1】:
您是如何获得coord
和Y
的?如果您通过计算而不是直接分配获得它们,即使它们显示出来,它们也可能不完全相等。例如:
julia> p1 = fill((6.0, 1.0))
0-dimensional ArrayTupleFloat64,Float64,0:
(6.0, 1.0)
julia> p2 = fill((7.0 + 3eps(), 1.0))
0-dimensional ArrayTupleFloat64,Float64,0:
(7.000000000000001, 1.0)
julia> Y = [p1, p2]
2-element ArrayArrayTupleFloat64,Float64,0,1:
(6.0, 1.0)
(7.0, 1.0) # NOTE that it get truncated in display but the content did not changed!
julia> x = fill((6.0, 1.0))
0-dimensional ArrayTupleFloat64,Float64,0:
(6.0, 1.0)
julia> x in Y
true
julia> x = fill((7.0, 1.0))
0-dimensional ArrayTupleFloat64,Float64,0:
(7.0, 1.0)
julia> x in Y
false
如果是这种情况,您可以在比较之前对它们进行四舍五入,或者使用isapprox
(或≈
运算符,在Julia 中通过\approx
+ Tab 键入)手动编写in
函数
【讨论】:
是的,这就是问题所在!但我之前没有考虑过,因为我计算的方式是 7/100*100。很高兴知道未来!非常感谢。 isapprox 听起来更合适,我会检查精度。以上是关于使用 Julia 将 in() 与元组数组一起使用时出错的主要内容,如果未能解决你的问题,请参考以下文章