Julia 在使用变量计算时打印出不同的结果
Julia prints different results when calculating with variables
问题很难描述(因此标题不好),更容易显示:
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]
.
由于第一个结果是错误的,我想知道这个问题是怎么产生的,如何预防。
这是一个 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
个索引都为真,以便与 [=37 进行链接比较=] true
第 k
个索引。
相反,您可以使用显式括号编写相同的术语,以解决优先级问题。
print((matr[:,2].==i) .* (matr[:,3].!=i))
您可以广播 &
.
而不是乘法
print((matr[:,2].==i) .& (matr[:,3].!=i))
这两个应该会给你正确的答案。
问题很难描述(因此标题不好),更容易显示:
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]
.
由于第一个结果是错误的,我想知道这个问题是怎么产生的,如何预防。
这是一个 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
个索引都为真,以便与 [=37 进行链接比较=] true
第 k
个索引。
相反,您可以使用显式括号编写相同的术语,以解决优先级问题。
print((matr[:,2].==i) .* (matr[:,3].!=i))
您可以广播 &
.
print((matr[:,2].==i) .& (matr[:,3].!=i))
这两个应该会给你正确的答案。