В чем разница между & и && в MATLAB?

65

В чем разница между логическими операторами & и && в MATLAB?

Теги:
short-circuiting
logical-operators

7 ответов

81
Лучший ответ

Единственный амперсанд и является логическим оператором И. Двойной амперсанд & снова является логическим оператором И, который использует короткое замыкание. Короткое замыкание означает, что второй операнд (правая сторона) оценивается только тогда, когда результат не полностью определяется первым операндом (левая сторона)

A и B (A и B оцениваются)

A && B (B оценивается только в том случае, если A истинно)

  • 66
    По предупреждению: & может работать с массивами, но && может работать только со скалярами.
  • 0
    Примечание: после 15 лет работы с Matlab почти каждый день я всегда использую '&', и это никогда не кусало меня в задницу. ОТО, я знаю многих людей, которых раздражает использование «&&», потому что они должны помнить, что оно не универсально (да, я понимаю, что «&» не так эффективно, потому что оно не замыкает накоротко, но я почти никогда не ошибаюсь) цепочка моих операндов, поэтому в настоящее время экономия незначительна).
Показать ещё 4 комментария
24

&& и || всегда принимают скалярные входы и короткое замыкание. | и & принимают входы массива и короткое замыкание только в операциях if/while. Для назначения последние не замыкаются.

Подробнее см. эти страницы doc.

  • 1
    У вас есть какая-либо информация о ярлыках версий Matlab & и | в заявлениях if / while? Похоже, это не относится к R2012b и R2014a.
  • 0
    @ Лорен, есть идеи, почему они разработали один, чтобы работать только со скалярами? Это кажется странным ...
Показать ещё 1 комментарий
11

Как уже упоминалось другими, & является логическим оператором AND и && является оператор короткого замыкания AND. Они отличаются тем, как оцениваются операнды, а также независимо от того, работают ли они на массивах или скалярах:

  • & (оператор AND) и | (оператор OR) могут работать на массивах по-элементному.
  • && и || - это версии с коротким замыканием, для которых второй операнд оценивается только тогда, когда результат не полностью определяется первым операндом. Они могут работать только на скалярах, а не на массивах.
7

Оба являются логическими операциями И. && хотя, является оператором "короткого замыкания". Из документов MATLAB:

Они являются операторами короткого замыкания, поскольку они оценивают свой второй операнд только тогда, когда результат не полностью определяется первым операндом.

Подробнее здесь.

5

Как и другие языки, '&' является логическим побитовым оператором, тогда как '& &' является логической операцией.

Например (прошу простить мой синтаксис).

Если A = [True True False True]  B = False

A и B = [False False False False]

.. или если B = True A и B = [True True False True]

Для "& &" правый операнд вычисляется только в том случае, если левый операнд является истинным, а результат представляет собой одно логическое значение.

x = (b ~ = 0) && & (a/b > 18.5)

Надеюсь, что это ясно.

  • 3
    Это не побитно, это поэлементно.
  • 0
    Ну, этот вопрос уже получил ~ 115 тыс. Просмотров, что означает, что многие люди читали дезинформацию здесь. Многие из этих ответов являются неполными или содержат неверную информацию. Все, что вам нужно сделать, это исправить свой ответ или удалить его. Кстати: bitand - это побитовый логический оператор AND в MATLAB.
3

& & и || операторы короткого замыкания, работающие на скалярах. и | всегда оценивать оба операнда и работать с массивами.

2

Хорошее эмпирическое правило при построении аргументов для использования в условных операторах (IF, WHILE и т.д.) должно всегда использовать & &/|| формы, если нет веской причины не делать этого. Есть две причины...

  • Как уже упоминалось, короткозамкнутое поведение &/|| аналогичен большинству C-подобных языков. То, что сходство/знакомство обычно считается точкой в ​​его пользу.
  • Использование && или || формы заставляет вас написать полный код для определения вашего намерения для векторных аргументов. Когда a = [1 0 0 1] и b = [0 1 0 1], является истинным или ложным? Я не могу вспомнить правила для MATLAB &, вы можете? Большинство людей не могут. С другой стороны, если вы используете && или ||, вы FORCED, чтобы написать код "в полном объеме", чтобы разрешить условие.

Выполнение этого, вместо того, чтобы полагаться на разрешение MATLAB векторов в и и |, приводит к тому, что код немного более подробный, но LOT безопаснее и проще в обслуживании.

  • 1
    +1, но следует отметить, что ваш ответ относится только к случаям, когда вы хотите, чтобы конечный результат операции был скалярным. Есть много вариантов использования & и | где && и || бесполезны, потому что они не могут возвращать массивы, например, когда выполняют необычную индексацию, такую как «выбор всех r от 1 до 2: r((r<2)&(r<2)) ».
  • 0
    Хороший вопрос, Джонас. Когда я писал это, я думал об условных обозначениях, а не о «логической индексации» (термин MATLAB для «необычной индексации», о которой вы упоминали). Я изменил первое предложение своего поста, чтобы отразить это. Спасибо за напоминание!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню