Юля выводит разные результаты при расчетах с переменными

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

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].

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


person 00koeffers    schedule 14.04.2019    source источник


Ответы (1)


Это оператор приоритет. То, что вы пишете в первом 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))

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

person hckr    schedule 14.04.2019