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

Ответы:

93

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

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

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

Fraser
источник
75
С предостережением: &может работать с массивами, но &&может работать только со скалярами.
gnovice
Замечание: после 15 лет работы с Matlab почти ежедневно я всегда использую '&', и это никогда не кусало меня по заднице. OTOH, я знаю многих людей, которых раздражает использование '&&', потому что они должны помнить, что это не универсально (да, я понимаю, что '&' не так эффективен, потому что он не замыкается, но я почти никогда не цепляю- связать мои операнды, поэтому экономия в настоящее время незначительна).
Эрик
7
@neuronet на самом деле не об эффективности, а скорее о разрешении конструкции, в которой первое выражение гарантирует условие, без которого второе выражение может вызвать ошибку времени выполнения. например d != 0 && 1/dvs d !=0 & 1/d- первое гарантирует отсутствие деления на ноль, второе - нет.
Fraser
2
Этот ответ неполный и неточный. &делает короткое замыкание, если в ifзаявлении. И &&принимает скалярные входы. @ Ответ Лорен ниже правильный.
Крис
2
Также обратите внимание, что Лорен - сотрудник MathWorks. Нет ответа более авторитетного, чем этот. Если вы готовы пожертвовать собой, вы можете пометить свой ответ, чтобы мод удалил его (вы не можете удалить его самостоятельно, потому что он принят). Вы сохраните репутацию, полученную в результате этого (если я правильно понимаю систему), и мы получим технически правильный и авторитетный главный ответ.
Андрас Деак
35

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

См. Эти страницы документации для получения дополнительной информации.

Лорен
источник
1
У вас есть какая-либо информация о ярлыках версий Matlab &и |в операторах if / while? Похоже, что это не относится к R2012b и R2014a.
Тим
@Loren есть идеи, почему они разработали его для работы только со скалярами? Это кажется странным ...
Эрик
@neuronet: короткое замыкание невозможно, если вы работаете с массивами.
Крис
17

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

  • &(Оператор И) и |(Оператор ИЛИ) могут работать с массивами поэлементно.
  • &&и ||являются версиями с коротким замыканием, для которых второй операнд оценивается только тогда, когда результат не полностью определяется первым операндом. Они могут работать только со скалярами , но не с массивами.
Гновице
источник
8

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

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

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

отметка
источник
6

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

Например (простите за синтаксис).

Если..

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
Это не побитовое, а поэлементное.
Крис
3
Я действительно поправился 10 лет спустя? 😺
Эрик Кербер
Что ж, на данный момент этот вопрос набрал ~ 115 тысяч просмотров, что означает, что многие люди прочитали здесь дезинформацию. Многие из этих ответов неполны или содержат неверную информацию. Все, что вам нужно сделать, это исправить свой ответ или удалить его. BTW: bitandэто побитовый логический оператор AND в MATLAB.
Крис
2

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

  1. Как уже упоминалось другими, короткое замыкание && / || похож на большинство C-подобных языков. Это сходство / знакомство обычно считается аргументом в его пользу.
  2. Использование && или || Forms заставляет вас написать полный код для определения вашего намерения для векторных аргументов. Когда a = [1 0 0 1] и b = [0 1 0 1], является ли a & b истинным или ложным? Я не могу вспомнить правила для MATLAB &, а вы? Большинство людей не могут. С другой стороны, если вы используете && или ||, вы ПРИНУЖДАЕТЕ написать код «полностью», чтобы устранить условие.

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

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