Julia中使用&运算符进行布尔匹配的语法问题咨询
问题分析与解决方案
你遇到的问题核心是Julia的运算符优先级与R不同,加上对矢量化逻辑运算符的使用误解,导致表达式行为不符合预期。
为什么原代码得到全0?
先看你写的表达式:
3 .== dummy & 4 .== dummy
在Julia中,&是标量位运算符,它的优先级高于矢量化比较运算符.==。所以这个表达式会被Julia解析成:
3 .== (dummy & 4) .== dummy
这显然不是你想要的逻辑——它先对dummy和4做位运算,再进行两次比较,最终得到的结果自然不符合你的多条件匹配需求。
另外,就算语法正确,(3 .== dummy) & (4 .== dummy)(注意括号)也会得到全0,因为这里是要求同一个元素同时等于3和4,显然没有这样的元素,结果全0是合理的。我猜你可能是想实现“元素等于3或者等于4”的匹配?如果是这样,那逻辑运算符也需要调整。
正确的Julia语法
根据你的需求,分两种情况:
1. 匹配同时满足两个条件的元素(同一元素既等于3又等于4)
需要用矢量化逻辑与运算符.&,并且给每个比较条件加上括号明确优先级:
num_test = convert(Array{Int64}, (3 .== dummy) .& (4 .== dummy))
结果确实是[0 0 0 0 0],因为没有元素能同时满足两个条件。
2. 匹配满足任意一个条件的元素(等于3或等于4)
用矢量化逻辑或运算符.|,同样加上括号:
num_test = convert(Array{Int64}, (3 .== dummy) .| (4 .== dummy))
执行后会得到[0 0 1 1 0],这应该是你在R中实现的类似效果。
和R语法的差异
在R中,比较运算符的优先级高于逻辑运算符&/|,所以dummy ==3 & dummy ==4会自动先执行两个比较,再做逻辑运算。但Julia中,位/逻辑运算符的优先级更高,因此必须通过括号明确运算顺序,或者使用矢量化的逻辑运算符.&/.|来确保逐元素运算。
另外,Julia中的&是标量位运算,而.&才是矢量化的逻辑与;R中的&本身就是矢量化逻辑与,这也是容易混淆的点。
内容的提问来源于stack exchange,提问作者Andrew Bannerman
相关产品推荐
相关产品推荐

