Яка різниця між & та && у MATLAB?


Відповіді:


93

Поодинокий амперсанд & є логічним оператором І. Подвійний амперсанд && знову є логічним оператором І, що використовує поведінку короткого замикання. Коротке замикання просто означає, що другий операнд (справа) оцінюється лише тоді, коли результат не повністю визначений першим операндом (ліва сторона)

A & B (оцінюються A і B)

A&& B (B оцінюється, лише якщо A відповідає дійсності)


75
Застереження: &може оперувати масивами, але &&може оперувати лише скалярами.
gnovice

Примітка: після 15 років роботи з Matlab майже щодня я завжди використовую "&", і це ніколи не кусало мене за дупу. ОТО, я знаю багатьох людей, які дратуються, використовуючи "&&", тому що вони повинні пам'ятати, що це не є універсальним (так, я розумію, що "&" не таке ефективне, оскільки воно не замикає, але я майже ніколи не мої операнди, так що економія сьогодні незначна).
eric

7
@neuronet це насправді не про ефективність, більше того, що вона дозволяє конструкцію, де перший вираз гарантує умову, без якої другий вираз може спричинити помилку під час виконання. напр. d != 0 && 1/dvs d !=0 & 1/d- перша гарантує відсутність ділення на нуль, друга - ні.
Фрейзер

2
Ця відповідь є неповною та неточною. &робить коротке замикання, якщо в ifзаяві. І &&приймає скалярні входи. @ Відповідь Лорен нижче є правильною.
Cris

2
Також зверніть увагу, що Лорен - співробітник MathWorks. Відповідь не стає більш авторитетною. Якщо ви готові пожертвувати, ви можете позначити свою відповідь модом, щоб видалити його (ви не можете видалити його самостійно, оскільки це прийнято). Ви б зберегли виграш, який ви отримали від нього (якщо я правильно розумію систему), і в підсумку ми отримали б технічно правильну та авторитетну найкращу відповідь.
Андраш

35

&&і завжди ||приймайте скалярні входи та коротке замикання. |і &приймайте входи масиву та коротке замикання лише у операторах if / while. Для призначення останні не замикають.

Докладнішу інформацію див. На цих сторінках документів .


1
Чи є у вас інформація про те, які ярлики версій Matlab &і |в операторах if / while? Здається, це не так у R2012b та R2014a.
Тім

@Loren будь-яка ідея, чому вони розробили такий для роботи лише зі скалярами? Це здається дивним ...
Ерік,

@neuronet: Ви не можете зробити коротке замикання, якщо оперуєте масивами.
Cris

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
Це не побітово, це стихійно.
Cris

3
Хіба я щойно вилікувався через 10 років? 😺
Ерік Кербер

Що ж, це питання на сьогоднішній день набрало ~ 115 тис. Переглядів, що означає, що багато людей читали тут дезінформацію. Багато з цих відповідей є неповними або містять неправильну інформацію. Все, що вам потрібно зробити, це виправити свою відповідь або видалити її. ДО: bitandє побітовим логічним оператором І в MATLAB.
Cris


2

Хорошим емпіричним правилом при побудові аргументів для використання в умовних операторах (IF, WHILE тощо) є завжди використовувати && / || форми, якщо немає дуже вагомих причин, щоб цього не робити. Є дві причини ...

  1. Як зазначали інші, короткозамкнена поведінка && / || подібний до більшості мов, подібних до С. Ця схожість / фамільярність, як правило, вважається моментом на її користь.
  2. Використання && або || form змушує писати повний код для вирішення вашого наміру для векторних аргументів. Коли 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 для "вигадливого індексування"). Я змінив перше речення свого допису, щоб це відобразити. Дякуємо за нагадування!
Боб Гілмор,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.