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

switch oder if/elseif?

 

rumpfutsch
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.06.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 24.11.2011, 15:29     Titel: switch oder if/elseif?
  Antworten mit Zitat      
Hallo zusammen,

ich habe hier drei logische Variablen (logic0, logic1 und logic2) und je nach Kombination sollen bestimmte Funktionen ausgeführt werden.
Momentan habe ich das so gelöst:

Code:

if logic0==1 && logic1==1 && logic2==1
% Fall 1
    ... % Funktion 1
elseif logic0==1 && logic1==1 && logic2==0
% Fall 2
    ... % Funktion 2
elseif logic0==1 && logic1==0 && logic2==1
% Fall 3
    ... % Funktion 3
elseif logic0==1 && logic1==0 && logic2==0
% Fall 4
    ... % Funktion 4
elseif logic0==0 && logic1==1 && logic2==1
% Fall 5
    ... % Funktion 5
elseif logic0==0 && logic1==1 && logic2==0
% Fall 6
    ... % Funktion 6
elseif logic0==0 && logic1==0 && logic2==1
% Fall 7
    ... % Funktion 7
else
% (logic0==0 && logic1==0 && logic2==0)
% Fall 8
    ... % Funktion 8
end
 


Jetzt weiß ich nicht, ob das die eleganteste Methode ist oder ob ich lieber den switch-Befehl benutzen soll.
Was wäre denn die beste Umsetzung? Hat jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.11.2011, 17:11     Titel: Re: switch oder if/elseif?
  Antworten mit Zitat      
Hallo rumpfutsch,

Das kann man eleganter formulieren. Der Vergleich mit "==1" ist überflüssig. Dann kann man die wiederholten Tests vermeiden:
Code:
if logic0
  if logic1
    if logic2
      % Fall 1
    else
      % Fall 2
    end
  else
    if logic2
      % Fall 3
    else
      % Fall 4
    end
  end
else  % logic0 == 0
   if logic1
     if logic2
       % Fall 5
     else
       % Fall 6
     end
   else
     if logic2
       % Fall 7
     else
       % Fall 8
     end
   end
end

Das ist nicht hübscher, aber schneller. Hier sind unbedingt Kommentare für jeden einzelnen Fall nötig.

Alternative:
Code:
switch 9 - (logical0 + 2 * logical1 + 4 * logical2)
case 1  % Fall 1
case 2  % Fall 2
case 3  % Fall 3
case 4  % Fall 4
case 5  % Fall 5
case 6  % Fall 6
case 7  % Fall 7
case 8  % Fall 8
otherwise
  error('Programming error!');   % No SWITCH without OTHERWISE - NEVER!
end

Hier sind die Kommentare schon fast überflüssig.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
rumpfutsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.06.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 25.11.2011, 10:06     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort!

Da ich aber nicht ganz fit bin mit dem switch-Befehl, wollte ich nochmal nachfragen, was genau die Zeile
Code:

switch 9 - (logical0 + 2 * logical1 + 4 * logical2)
 

bedeutet.

9 glaube ich noch zu verstehen: es gibt 8 Fälle und 1 otherwise.
Aber warum muss man die logischen Variablen addieren?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 25.11.2011, 11:26     Titel:
  Antworten mit Zitat      
müsste es nicht?
Code:
8 - (logical0 + 2 * logical1 + 4 * logical2)
 
erzeugt dann die zahlen 1-8. das - is weil dein fall oben das so beschreibt. alles true is fall 1 also 8-(1+2*1+4*1)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.11.2011, 12:10     Titel:
  Antworten mit Zitat      
Hallo Winkow, hallo rumpfutsch

Ja, es muss "8 - (logical0 + 2 * logical1 + 4 * logical2)" heißen. Ich verbessere meinen alten Beitrag.

"help switch" sollte hilfreich sein. Die 9 (abgesehen davon, dass es ein Tippfehler war) hat nichts mit der Anzahl der Cases zu tun. Es muss nur irgendein eindeutiger Ausdruck für SWITCH gebildet werden, der zu einer der CASE Ausdrücke passt.
"8 - (logical0 + 2 * logical1 + 4 * logical2)" habe ich nur deshalb statt ""logical0 + 2 * logical1 + 4 * logical2" gewählt, weil mit der ersten Methode der "Fall 1" auch die Zahl 1 erhält, der "Fall 2" die Zahl 2 etc. Es wäre aber auch dies möglich: ""7*logical0 + 77*logical1 + 777*logical2", aber dann müssten sehr wilde Zahlen hinter den CASEs stehen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
rumpfutsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 03.06.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 25.11.2011, 15:33     Titel:
  Antworten mit Zitat      
Aaaah, ich habs verstanden:
das ist gar kein Programmcode, sondern eine Rechnung!
Und je nachdem welchen Wert meine logischen Variablen annehmen, ändere ich den Case!
Raffiniert...
Auf jeden Fall vielen, vielen Dank für die Antwort! Ihr habt mir wahnsinnig geholfen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 25.11.2011, 15:34     Titel:
  Antworten mit Zitat      
kein ding ^^ haben ja nix besseres zu tun Smile
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 - 2025 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.