Юлия печатает разные результаты при расчете с переменными - PullRequest
0 голосов
/ 14 апреля 2019

Проблему сложно описать (отсюда и плохой титул), ее проще показать:

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)

Первая и вторая печать () должны быть эквивалентны. В любом случае, первый печатает Bool[false, false, false, false], второй печатает Bool[true, true, false, false].

Поскольку первый результат неверен, мне интересно, как возникает эта проблема и как ее можно предотвратить.

1 Ответ

2 голосов
/ 14 апреля 2019

Это приоритет оператора проблема. То, что вы пишете в первом print, не соответствует вашим ожиданиям.

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

Это эквивалентно (см. Скобки)

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

, который представляет собой сравнение цепочек , так что matr[k,2] == (i .* matr[k,3])) и matr[k,2] == (i .* matr[k,3])) должны быть истинными для k-го индекса, чтобы сравнение цепочек вернуло true для k й индекс.

Вместо этого вы можете написать тот же термин с явными скобками, чтобы позаботиться о проблеме приоритета.

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

Вместо умножения вы можете транслировать &.

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

Оба из них должны дать вам правильный ответ.

...