使用变量进行计算时,Julia打印不同的结果

时间:2019-04-14 12:24:07

标签: boolean julia bitarray

这个问题很难描述(因此名称不好),显示起来更容易:

matr =
[
1 1 3
2 1 10
3 2 3
13 8 10]

i=1

print(matr[:,2].==i .* matr[:,3].!=i)
x = matr[:,2].==i
y = matr[:,3].!=i
print(x .* y)

第一和第二个print()应该相等。无论如何,第一个打印Bool[false, false, false, false],第二个打印Bool[true, true, false, false]

由于第一个结果是错误的,所以我想知道这个问题是如何产生的以及如何预防。

1 个答案:

答案 0 :(得分:2)

这是一个operator precedence问题。您在第一个print中写的不是您想要的。

print(matr[:,2].==i .* matr[:,3].!=i)

这等效于(请参见括号)

print(matr[:,2] .== (i .* matr[:,3]) .!=i)

这是chaining comparison,因此对于第matr[k,2] == (i .* matr[k,3]))个索引,matr[k,2] == (i .* matr[k,3]))k都必须为真,以便链比较返回{{1} }作为第true个索引。

相反,您可以在显式括号中写相同的术语,以解决优先级问题。

k

您可以广播print((matr[:,2].==i) .* (matr[:,3].!=i)) 而不是乘法。

&

这两种方法都应该给您正确的答案。