Was ist der Unterschied zwischen & und && in MATLAB?

Antworten:

93

Das einzelne kaufmännische Und & ist der logische UND-Operator. Das doppelte kaufmännische Und && ist wieder ein logischer UND-Operator, der ein Kurzschlussverhalten verwendet. Kurzschluss bedeutet nur, dass der zweite Operand (rechte Seite) nur ausgewertet wird, wenn das Ergebnis vom ersten Operanden (linke Seite) nicht vollständig bestimmt wird.

A & B (A und B werden bewertet)

A && B (B wird nur ausgewertet, wenn A wahr ist)

Fraser
quelle
75
Vorbehalt: &Kann auf Arrays arbeiten, &&kann aber nur auf Skalaren arbeiten.
Gnovice
Randnotiz: Nach 15 Jahren Arbeit mit Matlab fast täglich benutze ich immer '&' und es hat mich nie in den Arsch gebissen. OTOH, ich kenne viele Leute, die sich über '&&' ärgern, weil sie sich daran erinnern müssen, dass es nicht universell ist (ja, mir ist klar, dass '&' nicht so effizient ist, weil es nicht kurzschließt, aber ich bin so gut wie nie daisy- Kette meine Operanden, so dass die Einsparungen heutzutage vernachlässigbar sind).
Eric
7
@neuronet Es geht nicht wirklich um Effizienz, sondern darum, ein Konstrukt zuzulassen, bei dem der erste Ausdruck eine Bedingung garantiert, ohne die der zweite Ausdruck einen Laufzeitfehler verursachen kann. zB d != 0 && 1/dvs d !=0 & 1/d- der erste garantiert keine Division durch Null, der zweite nicht.
Fraser
2
Diese Antwort ist unvollständig und ungenau. &macht einen Kurzschluss, wenn in einer ifAnweisung. Und &&nimmt skalare Eingaben. @ Lorens Antwort unten ist richtig.
Cris Luengo
2
Beachten Sie auch, dass Loren ein MathWorks-Mitarbeiter ist. Eine Antwort wird nicht maßgeblicher. Wenn Sie bereit sind, ein Opfer zu bringen, können Sie Ihre Antwort für einen Mod markieren, um es zu löschen (Sie können es nicht selbst löschen, weil es akzeptiert wird). Sie würden die Wiederholung behalten, die Sie daraus gewonnen haben (wenn ich das System richtig verstehe), und wir würden am Ende eine technisch korrekte und maßgebliche Top-Antwort erhalten.
Andras Deak
35

&&und ||nehmen Sie immer skalare Eingaben und Kurzschlüsse. |und &Array-Eingänge nehmen und nur in if / while-Anweisungen kurzschließen. Letztere schließen für die Zuordnung nicht kurz.

Weitere Informationen finden Sie auf diesen Dokumentseiten .

Loren
quelle
1
Haben Sie Informationen darüber, welche Matlab-Versionen verknüpft sind &und |in if / while-Anweisungen? Dies scheint in R2012b und R2014a nicht der Fall zu sein.
Tim
@Loren eine Idee, warum sie eine entworfen haben, um nur mit Skalaren zu arbeiten? Es scheint seltsam ...
Eric
@neuronet: Sie können nicht kurzschließen, wenn Sie mit Arrays arbeiten.
Cris Luengo
17

Wie bereits von anderen erwähnt, &ist es ein logischer UND-Operator und &&ein Kurzschluss-UND-Operator . Sie unterscheiden sich darin, wie die Operanden ausgewertet werden und ob sie mit Arrays oder Skalaren arbeiten oder nicht:

  • &(AND-Operator) und |(OR-Operator) können Arrays elementweise bearbeiten.
  • &&und ||sind Kurzschlussversionen, für die der zweite Operand nur ausgewertet wird, wenn das Ergebnis vom ersten Operanden nicht vollständig bestimmt wird. Diese können nur mit Skalaren arbeiten , nicht mit Arrays.
gnovice
quelle
8

Beides sind logische UND-Operationen. Das && ist jedoch ein "Kurzschluss" -Operator. Aus den MATLAB-Dokumenten:

Sie sind Kurzschlussoperatoren, da sie ihren zweiten Operanden nur dann auswerten, wenn das Ergebnis vom ersten Operanden nicht vollständig bestimmt wird.

Sehen Sie hier mehr .

Kennzeichen
quelle
6

Ähnlich wie in anderen Sprachen &handelt es sich um einen logischen bitweisen Operator, während &&es sich um eine logische Operation handelt.

Zum Beispiel (verzeihen Sie meine Syntax).

Wenn..

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

..oder..

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

Denn &&der rechte Operand wird nur berechnet, wenn der linke Operand wahr ist und das Ergebnis ein einzelner boolescher Wert ist.

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

Hoffe das ist klar.

Erik Kerber
quelle
3
Es ist nicht bitweise, es ist elementweise.
Cris Luengo
3
Bin ich erst 10 Jahre später gesund geworden? 😺
Erik Kerber
Nun, diese Frage hat bisher ~ 115.000 Aufrufe erhalten, was bedeutet, dass viele Leute hier Fehlinformationen gelesen haben. Viele dieser Antworten sind unvollständig oder enthalten falsche Informationen. Sie müssen lediglich Ihre Antwort korrigieren oder löschen. Übrigens: bitandist der bitweise logische AND-Operator in MATLAB.
Cris Luengo
2

Eine gute Faustregel gilt : wenn Argumente für den Einsatz in bedingten Anweisungen (IF, WHILE, etc.) Konstruktion ist immer die && / || zu verwenden Formen, es sei denn, es gibt einen sehr guten Grund, dies nicht zu tun. Es gibt zwei Gründe ...

  1. Wie andere bereits erwähnt haben, ist das Kurzschlussverhalten von && / || ähnelt den meisten C-ähnlichen Sprachen. Diese Ähnlichkeit / Vertrautheit wird allgemein als ein Punkt für sie angesehen.
  2. Verwenden Sie das && oder || Forms zwingt Sie, den vollständigen Code zu schreiben, um Ihre Absicht für Vektorargumente zu bestimmen. Wenn a = [1 0 0 1] und b = [0 1 0 1], ist a & b wahr oder falsch? Ich kann mich nicht an die Regeln für MATLABs & erinnern, oder? Die meisten Leute können nicht. Wenn Sie dagegen && oder || verwenden, müssen Sie den Code "vollständig" schreiben, um die Bedingung zu beheben.

Dies zu tun, anstatt sich auf MATLABs Auflösung von Vektoren in & und | zu verlassen, führt zu Code, der etwas ausführlicher ist, aber viel sicherer und einfacher zu warten ist.

Bob Gilmore
quelle
1
+1, aber es ist zu beachten, dass Ihre Antwort gilt nur für Fälle , in denen Sie wollen das endgültige Ergebnis der Operation Skalar zu sein. Es gibt viele Verwendungszwecke für & und | wo && und || sind nutzlos, weil sie keine Arrays zurückgeben können, beispielsweise wenn Sie eine ausgefallene Indizierung wie "Auswahl aller r zwischen 1 und 2: r((r<2)&(r<2))" durchführen.
Jonas Heidelberg
Guter Punkt, Jonas. Ich dachte an Bedingungen, nicht an "logische Indizierung" (der MATLAB-Begriff für die von Ihnen erwähnte "ausgefallene Indizierung"), als ich dies schrieb. Ich habe den ersten Satz meines Beitrags geändert, um dies widerzuspiegeln. Danke für die Erinnerung!
Bob Gilmore