Jaka jest różnica między & i && w MATLAB?


Odpowiedzi:


93

Pojedynczy ampersand & jest operatorem logicznym AND. Podwójny ampersand && jest ponownie operatorem logicznym AND, który wykorzystuje zachowanie zwarciowe. Zwarcie oznacza po prostu, że drugi argument (po prawej stronie) jest oceniany tylko wtedy, gdy wynik nie jest w pełni określony przez pierwszy argument (lewa strona)

A i B (oceniane są A i B)

A && B (B jest oceniane tylko wtedy, gdy A jest prawdziwe)


75
Z zastrzeżeniem: &może działać na tablicach, ale &&może działać tylko na skalarach.
gnovice

Na marginesie: po 15 latach pracy z Matlabem prawie codziennie zawsze używam „&” i nigdy nie ugryzł mnie w tyłek. OTOH, znam wielu ludzi, którzy denerwują się, używając znaku „&&”, ponieważ muszą pamiętać, że nie jest to uniwersalne (tak, zdaję sobie sprawę, że „&” nie jest tak wydajne, ponieważ nie powoduje zwarcia, ale prawie nigdy nie stokrotka). łańcuch moich operandów, więc oszczędności w dzisiejszych czasach są znikome).
eric

7
@neuronet tak naprawdę nie chodzi o wydajność, a raczej o dopuszczenie konstrukcji, w której pierwsze wyrażenie gwarantuje warunek, bez którego drugie wyrażenie może spowodować błąd w czasie wykonywania. np. d != 0 && 1/dvs d !=0 & 1/d- pierwszy gwarantuje brak dzielenia przez zero, drugi nie.
Fraser

2
Ta odpowiedź jest niepełna i niedokładna. &robi zwarcie, jeśli w ifinstrukcji. I &&pobiera dane skalarne. Odpowiedź @ Lorena poniżej jest poprawna.
Cris Luengo

2
Należy również pamiętać, że Loren jest pracownikiem MathWorks. Odpowiedź nie jest bardziej miarodajna. Jeśli chcesz się poświęcić, możesz oznaczyć swoją odpowiedź na mod, aby ją usunąć (nie możesz jej usunąć samodzielnie, ponieważ jest zaakceptowana). Zachowałbyś otrzymaną reprezentację (jeśli dobrze zrozumiem system), a my otrzymamy technicznie poprawną i autorytatywną najlepszą odpowiedź.
Andras Deak

35

&&i zawsze ||bierz skalarne dane wejściowe i zwarcie. |i &pobieraj dane wejściowe tablicowe i zwarcie tylko w instrukcjach if / while. Do przypisania te ostatnie nie powodują zwarcia.

Więcej informacji można znaleźć na tych stronach z dokumentami .


1
Czy masz jakieś informacje na temat skrótów do wersji Matlaba &i |instrukcji if / while? Wydaje się, że nie ma to miejsca w R2012b i R2014a.
Tim

@Loren masz jakiś pomysł, dlaczego zaprojektowali taki do pracy tylko ze skalarami? Wydaje się dziwne ...
eric

@neuronet: Nie możesz zwierać, jeśli operujesz na tablicach.
Cris Luengo

17

Jak już wspomniano przez innych, &to operator logiczny AND i &&jest zwarcie i operator . Różnią się sposobem oceny operandów, a także tym, czy działają na tablicach lub skalarach:

  • &(Operator AND) i |(operator OR) mogą działać na tablicach w sposób elementarny.
  • &&i ||są wersjami zwarciowymi, dla których drugi argument jest oceniany tylko wtedy, gdy wynik nie jest w pełni określony przez pierwszy argument. Mogą one działać tylko na skalarach , a nie na tablicach.

8

Obie są operacjami logicznymi AND. Jednak && jest operatorem „zwarcia”. Z dokumentacji MATLAB:

Są operatorami zwarć, ponieważ oceniają swój drugi argument tylko wtedy, gdy wynik nie jest w pełni określony przez pierwszy argument.

Zobacz więcej tutaj .


6

Podobnie jak w innych językach, &jest logicznym operatorem bitowym, podczas gdy &&jest operacją logiczną.

Na przykład (przepraszam za moją składnię).

Jeśli..

A = [True True False True]
B = False
A & B = [False False False False]

..lub..

B = True
A & B = [True True False True]

Bo &&prawy operand jest obliczany tylko wtedy, gdy lewy operand ma wartość true, a wynikiem jest pojedyncza wartość logiczna.

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

Mam nadzieję, że to jasne.


3
Nie jest bitowa, jest oparta na elementach.
Cris Luengo

3
Czy po prostu wyzdrowiałem - a właściwie miałem 10 lat później? 😺
Erik Kerber,

Cóż, to pytanie uzyskało do tej pory ~ 115 tysięcy wyświetleń, co oznacza, że ​​wiele osób przeczytało tutaj dezinformację. Wiele z tych odpowiedzi jest niekompletnych lub zawiera błędne informacje. Wszystko, co musisz zrobić, to poprawić swoją odpowiedź lub ją usunąć. BTW: bitandto bitowy operator logiczny AND w MATLAB.
Cris Luengo


2

Dobrą praktyczną zasadą podczas konstruowania argumentów do użycia w instrukcjach warunkowych (JEŻELI, GDY itd.) Jest zawsze używanie && / || formularze, chyba że istnieje bardzo dobry powód, aby tego nie robić. Są dwa powody ...

  1. Jak wspominali inni, zwarciowe zachowanie && / || jest podobny do większości języków podobnych do C. To podobieństwo / znajomość jest ogólnie uważane za punkt na jego korzyść.
  2. Używając && lub || formularze zmusza cię do napisania pełnego kodu decydującego o twoim zamiarze dla argumentów wektorowych. Kiedy a = [1 0 0 1] i b = [0 1 0 1], czy a & b jest prawdą czy fałszem? Nie pamiętam zasad MATLAB-ów, prawda? Większość ludzi nie może. Z drugiej strony, jeśli używasz && lub ||, jesteś ZMUSZONY napisać kod „w całości”, aby rozwiązać ten warunek.

Robiąc to, zamiast polegać na rozdzielczości wektorów MATLAB w & i |, prowadzi do kodu, który jest nieco bardziej szczegółowy, ale DUŻO bezpieczniejszy i łatwiejszy w utrzymaniu.


1
+1, ale należy zauważyć, że Twoja odpowiedź dotyczy tylko przypadków, w których chcesz, aby ostateczny wynik operacji był skalarny. Istnieje wiele zastosowań & i | gdzie && i || są bezużyteczne, ponieważ nie mogą zwracać tablic, na przykład podczas wykonywania wymyślnego indeksowania, takiego jak „zaznaczanie wszystkich r od 1 do 2: r((r<2)&(r<2))”.
Jonas Heidelberg

Słuszna uwaga, Jonas. Kiedy to pisałem, myślałem o warunkach warunkowych, a nie o „logicznym indeksowaniu” (termin MATLAB oznaczający „wymyślne indeksowanie”). Zmieniłem pierwsze zdanie mojego postu, aby to odzwierciedlić. Dzięki za przypomnienie!
Bob Gilmore,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.