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)

Fraser
źródło
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 .

Loren
źródło
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.
gnovice
źródło
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 .

znak
źródło
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.

Erik Kerber
źródło
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
4

&& i || są operatorami zwarć operującymi na skalarach. & i | działają na tablicach i używają zwierania tylko w kontekście wyrażeń pętli iflub while.

Dima
źródło
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.

Bob Gilmore
źródło
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,