提问人:Vance 提问时间:9/28/2021 更新时间:9/28/2021 访问量:128
对包含向量的复合类型对象进行相等性测试无法按预期工作。如何比较它们?
Equality testing of composite-type objects containing vectors doesn't work as expected. How to compare them?
问:
我创建一个自定义复合类型(或结构),创建该类型的两个对象,并测试它们是否相等:
struct mytype
stuff::Int64
end
a = mytype(5)
b = mytype(5)
a == b
true
这和我预期的那样有效。但是,如果我们将内容设置为向量,则比较并返回 false:a
b
struct mytype2
stuff::Vector{Int64}
end
a = mytype2([5])
b = mytype2([5])
a == b
false
a === b
false
isequal(a, b)
false
知道这是为什么吗?有没有办法比较,在第二种情况下,当它们包含向量时?a
b
答:
3赞
BatWannaBe
9/28/2021
#1
内置(意味着您不能添加方法)函数按地址比较可变结构,按内容比较不可变结构。 因为你的不可变和包含两个不同数组的地址,所以它们的内容是不同的。 是因为数组是分开的,有自己的地址。===
a === b
false
a
b
a.stuff === b.stuff
false
然后是 ,一个可以添加方法的函数。默认情况下,它回退到 ,并且“默认情况下应该是递归的”问题仍然是 Julia v2 (4648) 的未决问题。现在,您应该为自己的类型编写自己的方法。事实上,这是因为有专门针对 s 的方法。因此,对于您的类型,最简单的方法是:==
===
==
==
a.stuff == b.stuff
true
==
Array
Number
Base.:(==)(a::mytype2, b::mytype2) = a.stuff == b.stuff
在实践中,你的复合类型可能有更多的字段,所以写这些东西会变得乏味。问题 4648 包括一篇帖子(2021 年 1 月 15 日),该帖子介绍了一个生成的函数,该函数适用于结构的所有字段,尽管我个人还没有尝试过。structEqual
==
评论
Vector