Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Projektingenieur / Projektingenieurin Maschinenbau mit Kenntnissen in Matlab / Simulink
Durchführung von Simulationen und Berechnungen
HBI Haerter GmbH - Heidenheim an der Brenz (nahe Ulm)

System-Entwickler (m/w)
Analyse und Spezifikation von Systemanforderungen & Abstimmung von Anforderungen
MicroNova AG - Friedrichshafen

Ingenieur (w/m) modellbasierte Entwicklung / Embedded Programmierung
Organisation und Durchführung von Projekten zur Integration von TargetLink in aktuelle Entwicklungsprozesse
dSPACE GmbH - Pfaffenhofen

E-Drive Entwicklungsingenieur Hochvolt-Ladesystem (m/w)
Spezifikation von Lademanagement- sowie Ladeinterfacefunktionen im Lastenheft für die Serienentwicklung
MBtech Group GmbH & Co. KGaA - München

Software-Entwickler (m/w) Automotive
Implementierung und Verifizierung von Software-Modulen
MBtech Group GmbH & Co. KGaA - Neu-Ulm, Lindau

weitere Angebote

Partner:


Vermarktungspartner


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: 10.481
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.08.2011, 11: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: 17.801
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 26.08.2011, 19: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, 22: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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.