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

while-Schleife funktioniert nicht

 

Puschkin
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 20.06.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2021, 16:28     Titel: while-Schleife funktioniert nicht
  Antworten mit Zitat      
Hallo,
ich möchte für vier items randomisierte Starpositionen auf einem Kreis erzeugen und dabei sicherstellen, dass diese Positionen nicht zu nah an einander liegen. Dafür habe ich folgende while-Schleifen geschrieben, aber bei Ausführen bleibt das Programm immer hängen. Woran liegt es?

Code:
start{1}.ang = randi(360);
start{2}.ang = randi(360);
start{3}.ang = randi(360);
start{4}.ang = randi(360);

diff1 = start{1}.ang - start{2}.ang;
diff2 = start{1}.ang - start{3}.ang;
diff3 = start{1}.ang - start{4}.ang;
diff4 = start{2}.ang - start{3}.ang;
diff5 = start{2}.ang - start{4}.ang;
diff6 = start{3}.ang - start{4}.ang;

while diff1 < 20 && diff1 > -20 || diff2 < 20 && diff2 > -20 || diff3 < 20 && diff3 > -20
    start{1}.ang = randi(360);
end

while diff4 < 20 && diff4 > -20 ||  diff5 < 20 && diff5 > -20
start{2}.ang = randi(360);
end

while diff6 < 20 && diff6 > -20
start{3}.ang = randi(360);
end
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: 20.06.2021, 18:07     Titel:
  Antworten mit Zitat      
Hallo,

du aktualisierst die Variablen diff1 etc. in den while-Schleifen nicht.
Ich würde zudem empfehlen, Klammern zu setzen, um sicher zu gehen, dass die Bedingungen in der richtigen Reihenfolge abgearbeitet werden bzw. die Lesbarkeit zu erhöhen. Ich wäre mir nämlich nicht sicher, ob a&b|c&d nun als (a&b)|(c&d) oder als a&(b|c)&d ausgeführt wird.

Wenn deine Zielsetzung ist, Winkel zu bekommen, die sich um min. 20 Grad voneinander unterscheiden, dann sollte dir bewusst sein, dass eine Veränderung von start{2}.ang dazu führen kann, dass diff1 doch wieder klein wird. Zudem kann es passieren, dass ein Winkel auf 359 Grad und ein anderer auf 1 Grad festgelegt wird, was ja aber nur 2 Grad Unterschied sind.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Puschkin
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 20.06.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2021, 18:31     Titel:
  Antworten mit Zitat      
danke für den Hinweis mit den Klammern.

und ja, mein Ziel ist, Winkel zu bekommen, die sich um min. 20 Grad voneinander unterscheiden

"du aktualisierst die Variablen diff1 etc. in den while-Schleifen nicht" - heißt es, die jeweilige Variable wird gar nicht neu berechnet in meinen Schleifen?
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: 20.06.2021, 18:50     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
heißt es, die jeweilige Variable wird gar nicht neu berechnet in meinen Schleifen?

Nein, warum sollte sie?
Der Code wird der Reihe nach abgearbeitet. Wenn du nicht hinschreibst, dass an einer Stelle eine Variable neu berechnet werden soll, wird das auch nicht gemacht. Ebenso wenig in jeder anderen mir bekannten Programmiersprache.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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: 20.06.2021, 20:58     Titel:
  Antworten mit Zitat      
Hallo,

noch ein Vorschlag: es dürfte leichter sein, wenn du
1. ein Array angles = 1:360 mit den verfügbaren Winkeln erstellst
2. einen Winkel daraus auswählst, z.B. mit angles(randi(length(angles)))
3. diesen Winkel und alle anderen, die "zu nah sind" aus angles entfernst
4. wenn noch weitere Winkel benötigt werden, bei 2. weiter machen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Puschkin
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 20.06.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2021, 23:27     Titel:
  Antworten mit Zitat      
oh, danke für den Vorschlag, so wäre es sicher eine elegantere Lösung. Aber ich habe den zu spät gesehen und das ganze jetzt so umgebaut:
Code:
start{1}.ang = randi(360);
start{2}.ang = randi(360);
diff1 = start{1}.ang - start{2}.ang;
while diff1 < 20 && diff1 > -20
 start{1}.ang = start{1}.ang +20
 diff1 = start{1}.ang - start{2}.ang;
end
start{3}.ang = randi(360);
diff2 = start{1}.ang - start{3}.ang;
diff3 = start{2}.ang - start{3}.ang;
while (diff2 < 20 && diff2 > -20) || (diff3 < 20 && diff3 > -20)
start{3}.ang = start{3}.ang + 20;
diff2 = start{1}.ang - start{3}.ang;
diff3 = start{2}.ang - start{3}.ang;
end
start{4}.ang = randi(360);
diff4 = start{1}.ang - start{4}.ang;
diff5 = start{2}.ang - start{4}.ang;
diff6 = start{3}.ang - start{4}.ang;
while (diff4 < 20 && diff4 > -20) || (diff5 < 20 && diff5 > -20) || (diff6 < 20 && diff6 > -20)
start{4}.ang = start{4}.ang + 20;
diff4 = start{1}.ang - start{4}.ang;
diff5 = start{2}.ang - start{4}.ang;
diff6 = start{3}.ang - start{4}.ang;
end

 


Hoffe, ich habe nichts übersehen, was verglichen werden muss
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: 21.06.2021, 08:55     Titel:
  Antworten mit Zitat      
Hallo,

das wird nicht überprüft:
Zitat:
Zudem kann es passieren, dass ein Winkel auf 359 Grad und ein anderer auf 1 Grad festgelegt wird, was ja aber nur 2 Grad Unterschied sind.


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Puschkin
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 20.06.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2021, 20:23     Titel:
  Antworten mit Zitat      
Hallo
und danke. Stimmt natürlich, das habe ich übersehen. Verstehe ich das richtig, dass davon alle Fälle betroffen sind, wo die Differenz größer 341 ist (oder kleiner -341), und das wäre dann mit einer zusätzlichen Bedingung zu lösen?

Ich habe auch versucht, deinen Vorschlag zu befolgen, so in etwa:
Code:
angels = cell(360,1);
start{1}.ang = randi(length(angels));
a = start{1}.ang - 9 ; b =  start{1}.ang + 9;
angels(a:start{1}.ang)=[];
angels(start{1}.ang:b)=[];


aber hier wird auch ein Problem entstehen, wenn z. B. a<9 ist oder b>351, oder sehe ich das falsch?
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: 21.06.2021, 21:20     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
und das wäre dann mit einer zusätzlichen Bedingung zu lösen?

Wäre auf jeden Fall eine Möglichkeit.

Zitat:
Ich habe auch versucht, deinen Vorschlag zu befolgen, so in etwa:

Das Problem ist, dass du spätestens bei weiteren Winkeln nicht mehr den Überblick hast, welche der leeren Zellen für was stehen. Ich würde wirklich 1:360 verwenden.
Code:
angels = 1:360;
start{1}.ang = angels( randi(length(angels)) );
angels(abs(start{1}.ang - angels) < 20 | abs(start{1}.ang - angels) > 340) = [];

abs hilft, "doppelte" Überprüfungen zu kombinieren.
Statt 1 kannst du dann auch 2, 3, 4 verwenden bzw. eine for-Schleife.

Zitat:
aber hier wird auch ein Problem entstehen, wenn z. B. a<9 ist oder b>351, oder sehe ich das falsch?

Ein Problem würde vor allem auch entstehen, weil dabei a negativ und b > 360 werden kann.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.