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

Variable Zahl verschachtelter for-Schleifen

 

twixta
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 16.12.08
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 13.10.2010, 10:11     Titel: Variable Zahl verschachtelter for-Schleifen
  Antworten mit Zitat      
Guten Morgen!

Ich möchte für eine Brute-Force Optimierung mit variabler Zahl an Parametern, verschachtelte for-Schleifen verwenden. Das Heißt die Anzahl benötigter verschachtelter for-Schleifen hängt von meinen Einstellungen der Optimierungsparameter ab.

for
for
for
...
end
end
end

Hat jemand einen Vorschlag, wie man diesen Code geschickt strukturieren könnte?

Vielen Dank!
Christian
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: 13.10.2010, 12:08     Titel:
  Antworten mit Zitat      
Hallo Christian,

Eine Möglichkeit wäre, die Indices nicht in einzelnen Variablen, sondern in einem Vektor zu speichern.

Code:

n = 5;
start = ones(1, h)    % Startwert für jede FOR Schleife
limit = [3,4,5,6,7];    % Endwert für jede FOR Schleife

index = start;
ready = false;
while ~ready
   % ... Hier die Berechnungen
   disp(index);

   k = n;
   while 1
      index(k) = index(k) + 1;
      if index(k) < limit(k)
         break;   % k-ter Index um 1 erhöht
      else
         index(k) = start(k);
         k = k - 1;
         if k == 0  % All iterations are ready
            ready = true;  % Stop outer WHILE loop
            break;    % Break inner WHILE loop
      end
   end
end
 

Das simuliert Dir n FOR-Schleifen und "index(i)" ist der Wert des i.ten FOR-Schleifen-Zählers.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 16.12.08
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 13.10.2010, 14:35     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank, ich denke mit ein paar entsprechenden Laufvariablen kann ich damit sicher etwas anfangen!

in Zeile 14 war nur ein kleiner Fehler, darum hatte ich mich zunächst gewundert. Es muss heißen <= :

if index(k) <= limit(k)

Also nochmals vielen Dank!

Gruß,
Christian
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: 13.10.2010, 16:20     Titel:
  Antworten mit Zitat      
Hallo Christian,

ja, mit "<=" entspricht es eher der FOR-Schleife.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2011, 04:32     Titel: Modidikation variable Anzahl von Schleifen
  Antworten mit Zitat      
Hallo zusammen,

ich hätte eine kleine Frage an euch. Der Code hat mir schon sehr weitergeholfen, ich bräuchte allerdings noch eine kleine Hilfe bei der Modifikation:

Ich möchte eine variable Anzahl von Schleifen bauen, allerdings wird der Rechenaufwand bei hohen Limits schnell gigantisch. Für meine Zwecke würde es allerdings schon reichen wenn jede Kombination aus den einzelnen Schleifen-Indexen nur einmal auftritt, also für 3 Schleifen zum Beispiel

111
112
113
114
221
222
223
224
331
332
333
334
441
442
443
444
(16 Werte anstatt der 64 Werte normal)

und z.B. von 112/211/121 nur eines bei der Schleife durchlaufen wir (eine Kombination dieser 3 Zahlen). Die Limits der einzelnen Schleifen sind bei mir immer gleich (hier ja quasi 4).

Kann mir jemand bei diesem Knobel/Tüftel-Problem helfen!?

Vielen Dank für Eure Unterstützung und Hilfe!

Liebe Grüße

Christian
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2011, 08:24     Titel:
  Antworten mit Zitat      
Hallo,

warum tauchen den z.B. die Kombinationen 124,134 etc. bei dir nicht auf? Ist das Absicht?

Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2011, 12:14     Titel:
  Antworten mit Zitat      
Nein Smile das war natürlich ein Fehler... hatte das Beispiel zunächst nur mit 3 statt 4 als laufenden Index und das dann beim ergänzen vergessen Wink

Hat jemand eine Lösung zu diesem Problem?

Vielen Dank im Voraus!!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.12.2011, 18:58     Titel:
  Antworten mit Zitat      
Hallo Anonymous,

Ich verstehe die Fragestellung immer noch nicht. Kannst Du bitte nochmal das korrekte Ergebnis für 1:4 und 3 Elemente angeben?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Chris Lightman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2011, 08:01     Titel:
  Antworten mit Zitat      
Hi Jan,
Das war nur ein blödes unvollständiges Beispiel.
Mein Ziel ist es, eine variable Anzahl an for-Scheifen zu bauen (so wie dein tolles Beispiel), allerdings sollte jede Zahlenkombination der indices der Schleifen beim Durchlaufen dieser Schleifen nur einmal vorkommen, also 1,1,2 entweder als 112,121,211. In einer dieser Variationen, aber danach bestenfalls kein zweites Mal mehr in einer anderen, um den Rechenaufwand drastisch zu reduzieren.

In dem Beispiel oben, habe ich ein paar Zahlenkombinationen vergessen....

vielen dank für deine hilfe!
liebe Grüße
Christian
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.12.2011, 11:58     Titel:
  Antworten mit Zitat      
Hallo Chris Lightman,
Zitat:
In dem Beispiel oben, habe ich ein paar Zahlenkombinationen vergessen...

Welche Zahlenkombinationen hast Du vergessen? Kannst Du bitte einen vollständigen Satz von Ergebnissen posten? Der Text, mit dem Du das Ergebnis beschreibst, mag zwar eindeutig sein. Aber wenn ich eine Lösung posten möchte, ist es für mich sehr umständlich zu prüfen, ob es die von Dir gewünschte ist oder nicht.
Dein Problem ist nämlich nicht einfach die Menge der Kombinationen oder Permutationen ohne Wiederholung, denn eine Ziffer darf ja einmal wiederholt werden. Wie sieht das dann für 4 Ziffern in der Ausgabe aus? Wäre dann [1,1,2,2] eine erlaubte Lösung oder nicht? Solange das Problem nicht eindeutig beschrieben ist, sind sinnvolle Lösungen nicht möglich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Chris Lightman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2011, 11:21     Titel:
  Antworten mit Zitat      
Hi Jan,
selbstverständlich. Danke für deine Unterstützung und dein Interesse! Also für eine Anzahl von 4 Schleifen mit den Limits = [3,3,3,3] und somit

1111
1112, 1211, 1121, 2111
1113, 1131, 1311, 3111
1122, 1212, 1221, 2112, 2121, 2211
1123, 1132, 1213, 1231, 1312, 1321, 2113, 2131, 2311, 3112, 3211, 3121
1133, 1313, 1331, 3113, 3131, 3311
1222, 2122, 2212, 2221
2232, 2322, 2223, 3222
2222
1223, 1232, 1322, 2123, 2213, 2231,2132, 2312, 2321, 3122, 3212, 3221
2233, 2323, 2332, 3322, 3223, 3232
1233, 1323, 1332, 2133, 2313, 2331, 3123, 3132, 3213, 3231, 3312, 3321
1333, 3331, 3313, 3133
2333, 3332, 3233, 3323
3333

sind hier alle Permutationen aufgeführt (quasi 4 for-Schleifen). Diese durchläuft mein Programm mit Hilfe deines Codes für eine variable Anzahl von Schleifen bereits. Da ich nun meist 5-6 for-Schleifen habe mit Limits bis über 100 und dies sehr viele Iterationen bedeutet, ist mein Ziel: deinen Code so zu überarbeiten, dass nicht alle Permutationen durchlaufen werden, sondern für jede obige Zeile nur eine Permutation generiert wird. Also z.B.

entweder 1112,1211,1121 oder 2111. plus
entweder 2333, 3332, 3233, oder 3323 usw...


[Mein Algorithmus wertet für alle diese Ergebnisse das Selbe aus (und macht somit in diesem Beispiel 3 überflüssige Berechnungen)].

(Sollten einige seltene Zahlenkombinationen zwangsläufig doch öfters auftauchen müssen, so wäre dies auch kein Problem)

Vielen Dank für deine Hilfe!
Liebe Grüße
Christian
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.12.2011, 12:11     Titel:
  Antworten mit Zitat      
Hallo Chris Lightman,

Du suchst also die "Kombinationen mit Wiederholungen".
Das schafft z.B. die schnelle C-Mex-Implementierung http://www.mathworks.com/matlabcent.....eexchange/26277-vchoosekr:
Code:
y = VChooseKR(1:3, 4);


Wenn Du M-Code benötigst:
Code:
function Y = vchoosekr_m(X, K);
nX = numel(X);
Y  = X([]);        % Duplicate class of the input
if nX == 0 || K == 0
   return;
end

nY       = nchoosek(nX + K - 1, K);
Y(nY, K) = 0;  % Keep type of input
Index    = ones(1, K);             % Current index
Limit    = nX(ones(1, K));
Limit(K) = 0;
a        = 1;
while 1
   b = a + nX - Index(K);          % Write index for last column
   for i = 1:(K - 1)               % Write the left K-1 columns
      Y(a:b, i) = X(Index(i));
   end
   Y(a:b, K) = X(Index(K):nX);     % Write the K.th column
   a         = b + 1;              % Move the write pointer
   
   % Search the last column index, which is not exhausted:
   newLoop = find(Index < Limit);
   if isempty(newLoop)             % All columns are filled:
      return;                      % Ready!
   end
   newLoop = newLoop(length(newLoop));
   
   % Fill new Index with new value encreasing by 1:
   Index(newLoop:K) = Index(newLoop) + 1;
end

Hier haben wir wieder den selben Ansatz die geschachtelten FOR-Schleifen in eine einzelne WHILE-Schleife und einen Counter-Vektor zu transformieren.

Der Algorithmus ist nicht besonders effizient in Matlab. Es wäre schon schneller, die Indices a,b,K,i als INT32 zu definieren. Dieser Code diente aber eigentlich nur, um den deutlich schnelleren C-Code zu entwickeln.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Chris Lightman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2011, 08:17     Titel:
  Antworten mit Zitat      
Hi Ja,

Wow. Das ist ein cooler Code. Allerdings dauert er auch bei int32 noch sehr sehr lange.

Ich habe noch eine andere Bitte/Frage?

Wieder mit variablen Anzahl an for-Schleifen:

Angenommen bei den "Kombinationen mit Wiederholungen" sollen keine Zahlen zweimal in einer Permutation vorkommen, hast du für diesen Fall auch einen Algorithmus?

für ein Beispiel mit 4 Schleifen und dem Limits = [5,5,5,5] soll somit nur aus den unteren Zeilen jeweils nur Lösung pro Zeile für die Berechnung herangezogen werden:

1234,1243,1324,1342,1423,1432.....
1235,1253,1325,1352.....
1245,1254,1425......
1345,1354,1435.....
5324,5342,5423,5432.....

die Lösungsmenge für dieses Beispiel ist also 4.

Wenn ich mich an die gute alte Schulzeit zurückerinnere, dann sollte es nun sowas wie "Kombination ohne zurücklegen" sein. (also quasi die Lotto-Zahlen-Wahrscheinlichkeits-Berechnung)

x nCr y

Nur bräuchte ich diese Zahlenkombination der variablen for-Schleifen fpr weitere Berechnungen.
Idealerweise nicht in einer Matrix, sondern als kleine Variable, die auch wieder freigeben kann, damit der Arbeitsspeicher nicht vollläuft (bei Limits von 100+)!

Vielen Dank für deine Hilfe! Das bist wirklich eine klasse Unterstützung!

Liebe Grüße

Christian
 
Chris Lightman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2011, 08:19     Titel: Fehler im Beitrag gerade eben
  Antworten mit Zitat      
Die Lösungsmenge ist natürlich 5.
 
Chris Lightman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2011, 11:06     Titel:
  Antworten mit Zitat      
Meine statische Lösung für fünf Schleifen sieht wie folgt aus, aber wie gesagt, bräuchte ich diese Lösung als "Variable Anzahl von Schleifen"......

Code:

Array_Limits = 10;
Array = [1,2,3,4,5];
zaehler=1;

while Array(1) < Array(2)
   
    while Array(2) < Array(3)

        while Array(3) < Array(4)

            while Array(4) < Array(5)

                while Array(5) <= Array_Limits

                        %Here is the calculation
                        disp([num2str(zaehler),': ',num2str(Array(1)),num2str(Array(2)),num2str(Array(3)),num2str(Array(4)),num2str(Array(5))])
                        zaehler = zaehler+1;
                        if Array(5) < Array_Limits
                            Array(5) = Array(5)+1;
                        else
                            break;
                        end
                end

                if ((Array(5) == Array_Limits)&&(Array(4)<Array_Limits-1))
                    Array(4)=Array(4)+1;
                    Array(5)=Array(4)+1;  
                else
                    break;
                end

            end

            if ((Array(5) == Array_Limits)&&(Array(3)<Array_Limits-2))
                Array(3)=Array(3)+1;
                Array(4)=Array(3)+1;
                Array(5)=Array(4)+1;
            else
                break;
            end

        end

        if((Array(5) == Array_Limits)&&(Array(2)<Array_Limits-3))
            Array(2)=Array(2)+1;
            Array(3)=Array(2)+1;
            Array(4)=Array(3)+1;
            Array(5)=Array(4)+1;
        else
                break;
        end

    end
   
    if((Array(5) == Array_Limits)&&(Array(1)<Array_Limits-4))
        Array(1)=Array(1)+1;
        Array(2)=Array(1)+1;
        Array(3)=Array(2)+1;
        Array(4)=Array(3)+1;
        Array(5)=Array(4)+1;
    else
        break;
    end
   
end
 
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.