WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Was ist der Unterschied zwischen |, || und OR ?

 

Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.08.2011, 12:14     Titel: Was ist der Unterschied zwischen |, || und OR ?
  Antworten mit Zitat      
Hallo,

Die unterschiedlichen Operatoren für logische Verknüpfungen führen oft zu Verwirrungen. Man findet dazu viele Seiten im Netz, nun kommt noch eine weitere als goMatlab-Tutorial hinzu. Alle Erklärungen hier gelten auch equivalent für &, && und AND.

Der || Operator wird für Skalare eingesetzt, während | auch mit Arrays arbeitet:
Code:
a = 3;
b = 5;
M = rand(1, 10);

if a > 2 || b > 7, ...
if a > 2 | b > 7, ...  % Ebenfalls möglich, Skalare sind Arrays mit der Länge 1

if all(M > 0.9 | M < 0.1), ...


Zusätzlich gibt es noch die Short-circuiting Eigenschaft: Wenn der erste Operand von || ein logisches TRUE (alles ausser 0) zurückgibt, wird der zweite Operand nicht ausgeführt. Bei einfachen Variablen macht das keinen Unterschied, aber wenn man es für Funktionen benutzt schon. Hilfreich ist das z.B. in:
Code:
x = (b ~= 0) && (a/b > 18.5)

Hier vermeidet es eine Division durch Null.

Ein weiteres Beispiel: FPRINTF gibt die Anzahl der geschriebenen Zeichen zurück, hier also jeweils 1. Dann:
Code:
fprintf('1') | fprintf('2')
% >> 12
% ans = 1
fprintf('1') || fprintf('2')
% >> 1
% ans = 1

Mit || wird also das zweite FPRINTF also erst gar nicht aufgerufen, weil der gesamte Ausdruck sowieso TRUE liefert.

Innerhalb einer IF-Bedingung wird allerdings auch für den | Operator Short-circuiting angewendet (seit Matlab 6.1, seit 6.5 ist das auch dokumentiert). Das wird dann allerdings nahezu (oder total?) undurchschaubar:
Code:
if ([fprintf('1'), fprintf('2')] | [fprintf('3'), fprintf('4')])
  disp('ok');
end

Hier kommt noch dazu, dass die IF-Bedingung ein Vektor ist und intern ein (ALL(Condition) && ~isempty(Condition)) ausgeführt wird. Wenn jemand zur obigen Zeile ohne Ausprobieren die Ausgabe ins Command-Fenster vorhersagen kann, bekommt er von mir den Anerkennungspreis der Woche.

Zudem gibt es noch die Funktionen OR und AND, bei denen kein Sort-circuiting ausgeführt wird, weder innerhalb noch ausserhalb von IF-Bedingungen.


Zusammenfassung:
|, || und OR liefern die gleichen Ergebnisse für skalare Variablen.
|| arbeitet nur mit skalaren Inputs.
Der || Operator benutzt Short-circuiting, während der | Operator dies nur innerhalb von IF und WHILE Bedingungen macht.
Short-circuiting kann sehr viele Nanosekunden Rechenzeit sparen und kostet meist nur ein paar Tage Debug-Zeit. Ich vermeide deshalb Funktionsaufrufe mit logischen Verknüpfungen in IF-Bedingungen komplett und benutze stattdessen temporäre Variablen, in denen ich die Ergebnisse der Funktionen zwischenspeichere.

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.08.2011, 20:42     Titel:
  Antworten mit Zitat      
Hallo,

in Ergänzung dazu:

- Schreibweisen wie a < x < b führen nicht zu den vermutlich erwarteten Ergebnissen und sollten daher nicht vermieden werden. Stattdessen:
Code:
a < x & x < b


- Ein weiteres Beispiel für sinnvolle Verwendung von Short-Circuit-Operatoren sind Abfragen wie "falls a existiert und gleich 1 ist":
Code:
if exist('a', 'var') && a == 1
...
end

Wenn die Variable a nicht existiert, wird der zweite Teil nicht mehr abgetestet. Wie Jan schon sagte, verwendet MATLAB automatisch Short-Circuiting; das ganze funktioniert also auch mit einfachem &

- Je nach benötigter Auswertungszeit kann Short-Circuiting zu ganz gehörigen Zeitersparnissen führen, wenn dadurch eine langwierige Berechnung nicht ausgeführt werden muss.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Arochan
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 20.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.03.2012, 23:54     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
und sollten daher nicht vermieden werden.


Du meinst wohl:
und sollten daher vermieden werden. Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.