Matlab: eleganter Schleifenabbruch

Neue Frage »

Proggi Auf diesen Beitrag antworten »
Matlab: eleganter Schleifenabbruch
Hi Leute,
weiß jemand, ob es für folgenden Matlab-Code etwas Eleganteres oder Matlab-typischeres gibt?

zähler = 0;
while Bedingung1 && zähler<10
führe Befehl aus
zähler = zähler+1
end

Danke im Voraus.
Airblader Auf diesen Beitrag antworten »

In den meisten Sprachen kann man das durch "++"-Operator ganz nett abkürzen, Matlab besitzt diesen leider nicht. Wie elegant die Lösung wirklich ist, ist aber sowieso zweifelhaft. Man würde es jedenfalls etwa so machen (Pseudo-Code):

code:
1:
2:
3:
4:
ctr = 9;
while <condition> && ctr-- {
   <command>
}


Warum ist diese Lösung zweifelhaft? Weil der Wert von ctr in der Schleifenbedingung verändert wird – ein Vorgehen, das dort eigentlich nichts zu suchen hat und den Code daher etwas verwirrt. Bei der for-Schleife macht man sowas zwar auch, die ist aber auch genau dafür konzipiert.

Es ist ein ganz typisches Problem, dass schöner Code mit knappem Code verwechselt wird, auch ich selbst musste es mir abgewöhnen. Code ist gut, wenn er sich gut lesen lässt – so könnte man es ganz grob ausdrücken (das Thema ist komplex und es gibt viele Meinungen dazu).

Eine Alternative zu deinem Code wäre noch folgendes Snippet, das die Matlab-Syntax etwas ausnutzt:

code:
1:
2:
3:
4:
5:
6:
7:
for ctr = 0:9
    if !<condition>
        break;
    end;

    <command>;
end;


Zumindest spart man sich das Initialisieren des Zählers und das manuelle Hochzählen (man beachte die Negation der Bedingung). Im Gegenzug muss man halt eine zweite Einrückebene anfangen, was aber verkraftbar ist. Ich würde diese Version wohl bevorzugen, da man sofort im Auge hat, dass ctr hochgezählt wird.

Edit: Sorry, ich musste es ein wenig anpassen, da es sonst logisch nicht äquivalent war.

air
Airblader Auf diesen Beitrag antworten »

Kleines "Fun Fact":

Perl ist ja eine Sprache, bei der sich die Geister sehr scheiden. Aber was ich an Perl echt cool finde und in anderen Sprachen vermisse, ist die Möglichkeit für sowas:

code:
1:
2:
3:
4:
for ($ctr = 0; $ctr < 10; $ctr++) {
    last unless <condition>;
    <command>;
}


So richtig geil – meiner Meinung nach – wäre, wenn man beides mischen könnte:

code:
1:
2:
3:
4:
for ctr = 0:9
    last unless <condition>;
    <command>;
end;


So, das war nun aber wirklich Off-Topic. Augenzwinkern

Edit: Auch hier kleine Anpassungen, damit es logisch wirklich gleichwertig ist.

air
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von Airblader
code:
1:
2:
3:
4:
5:
for ctr = 0:9
    if <condition>
        <command>
    end;
end;


Ich würde diese Version wohl bevorzugen, da man sofort im Auge hat, dass ctr hochgezählt wird.


Allerdings wendet sich der Software-Programmierer mit Grausen. Augenzwinkern

Solche Konstrukte führen z.B. dazu, daß die Akkulaufzeit von Handys in die Knie geht, hab ich mir seinerzeit sagen lassen müssen, als ich da mitgemacht habe. Angenommen, Du bist fürs Telefonbuch verantwortlich, es kommt eine Nummer rein und Du mußt den Namen in Klartext zurückgeben. Du durchforstest dann alle 371 Einträge, obwohl Du schon beim zweiten fündig geworden bist.

Jetzt hast Du geEDITet, dann muß ich's auch tun: ein break in einer for-Schleife ist ebenfalls recht verpönt bei Programmierern. For-Schleifen sind nun mal For-Schleifen, da verläßt man sich drauf, daß sie abgearbeitet werden, wenn man die For-Zeile liest. So gibt es plötzlich einen Nebenausgang, den man schnell überliest oder vergißt. Und dann wurde was anderes in der For-Schleife plötzlich nicht mehr so oft getan, wie man es erwarten würde.

So schlimm sind while-Schleifen jetzt auch nicht zu lesen. Ich finde den Originalcode von Proggi elegant genug.

Viele Grüße
Steffen
Airblader Auf diesen Beitrag antworten »

Die Schleifen waren nicht gleichwertig, ich habe es inzwischen korrigiert. Augenzwinkern Eine bessere Lesbarkeit ist natürlich nichts wert, wenn der Code sich anders verhält. Ich finde die korrigierte Version dennoch besser und finde an der Originallösung vom Threadersteller ehrlich gesagt nichts Elegantes ("böse" ist die Lösung aber auch nicht).

air
Airblader Auf diesen Beitrag antworten »

Stimmt, ein break ist ebenfalls nicht das Tollste. Ich bevorzuge die Lösung aber dennoch, da for-Schleife und break-Anweisung optisch zusammen sind (und damit nicht so leicht übersehen werden), während in der Originallösung alle für die Schleife essentiellen Teile an verschiedenen Stellen auftreten. Wobei man das Inkrementieren natürlich auch voranstellen könnte.

Wie ich schon gesagt hatte: Was eleganten Code angeht, gibt es viele Meinungen. smile

air
 
 
Math1986 Auf diesen Beitrag antworten »

So wirklich schlimm finde ich ein break in einer Schleife nun wirklich nicht, gerade in dem Beispiel von Steffen Bühler ist es ja auch durch die Performance gerechtfertigt. In Java verwende ich teils auch eine return Anweisung in einer Schleife.

Ansonsten sollte die Schleifenvariable (sofern sie wirklich nur innerhalb der Schleife benutzt werden soll) auch dort deklariert werden - Variablen sollten so lokal wie möglich gehalten werden.
Proggi Auf diesen Beitrag antworten »

Hi,
danke für die vielen Antworten. Wie ich sehe, gehen die Meinungen der Programmierer mal wieder auseinander ;-) Aber gut zu wissen, dass es offensichtlich nicht DIE Matlab-Lösung gibt.
Gruß,
Proggi
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »