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

Dynamische for-Schleife ?

 

farzad73
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 17.11.07
Wohnort: ---
Version: 7.0
     Beitrag Verfasst am: 18.11.2007, 00:12     Titel: Dynamische for-Schleife ?
  Antworten mit Zitat      
Hallo Zusammen,
Ich habe folgendes Problem:
Ich muss ein Programm schreiben, in dem die Anzahl von for-Schleifen variable sind.
Als einfaches Beispiel für Anzahl = 2 :

for i1 = 1 : N
for i2 = 1 : N
tu etwas
end
end

Anzhal = 3
for i1 = 1 : N
for i2 = 1 : N
for i3 = 1 : N
tu etwas
end
end
end

Das heißt, das Programm muss die Anzahl lesen und wie oben zählen.

Hat jemand vielleicht eine Idee? Gibt es dazu Alternative?

Ich freue mich auf eure Antworten.

Danke+Grüße
Farzad
Private Nachricht senden Benutzer-Profile anzeigen


outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 18.11.2007, 23:34     Titel:
  Antworten mit Zitat      
wie wärs, wenn man trotzdem immer nur eine einzige Schleife verwendet, in dem man den gesamtanzahl von Schleifen berechnet und dann die schleife nur einmal startet, zB.

N = 1
for 1:N
tue etwas
end

N = 3
for 1:N^3
tue etwas
end







MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
farzad73
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 17.11.07
Wohnort: ---
Version: 7.0
     Beitrag Verfasst am: 19.11.2007, 00:10     Titel:
  Antworten mit Zitat      
Danke für deine Antwort,

Die Lösung ist leider nicht ganz einfach!

Man muss mit MATLAB, abhängig von Anzahl, neuen Code generieren!

Dann das Program mit eval kompilieren!

Die Idee ist da, aber die Lösung dauert noch ...

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 19.11.2007, 08:54     Titel:
  Antworten mit Zitat      
die Idee mit der Code Generation hatte ich auch, aber dazu muss man etwas mehr über die Aufgabestellung wissen. Vielleicht kannst Du dazu etwas schreiben?! Denn der Sinn der Sache ist für mich immer noch nicht nachvollziehbar - Gehts es um das Ergebnis oder um den Weg bis dahin...



MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
farzad73
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 17.11.07
Wohnort: ---
Version: 7.0
     Beitrag Verfasst am: 19.11.2007, 09:09     Titel:
  Antworten mit Zitat      
Du hast recht, ich sollte bisschen ausführlicher schreiben!

Beim Program, 'tue etwas' ist abhängin von i1,i2,...im

z.B. :

for i1 = 1 : N
sum = 0;
for i2 = 1 : N
sum = sum + a[i1][i2]
end
end

Grüße
Farzad
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 19.11.2007, 11:33     Titel:
  Antworten mit Zitat      
Ich vermute, du hast einen Matrix, die kann eindimensional, zwei-, drei- oder N-Dimensional sein. Je nach dem was das für eine ist werden mit Array-Elementen bestimmte Operationen durchgeführt (offensichtlich aufsummiert). Ist das so? Falls ja - brauchst Du (vermutlich) gar keine Schleifen... Ich denke man konnte die Aufgabe vektorisieren.





MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
farzad73
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 17.11.07
Wohnort: ---
Version: 7.0
     Beitrag Verfasst am: 19.11.2007, 12:24     Titel:
  Antworten mit Zitat      
Du hast genau richtig vermutet!

Ich habe eine Matrix, aber jedes mal (bei Ausführung) kann verschiedene Dimensionen haben und ich muss die Elemente dieser Matrix nach Zeilen, multiplizieren, und nach Spalten zusammenaddieren.

Ich füge einfach ein Teil meines Programs ein:
Code:

sum(N,2*N,2*N,3*N) = 0;
z = 1;
for i1 = 1 : N,
    for j1 = 1 : 2*N,
        for j2 = 1 : 2*N,
            for j3 = 1 : 2*N,
                sum(i1,j1,j2,j3) = 0;
                for k = 1 : d1,
                    sum(i1,j1,j2,j3) = sum(i1,j1,j2,j3) + P0_tr(k,1)*r(i1)^P0_tr(k,2)*...
                    cos(Teta(j1))^P0_tr(k,3)*cos(Teta(j2))^P0_tr(k,4)*cos(Teta(j3))*P0_tr(k,5)*...
                    sin(Teta(j1))^P0_tr(k,6)*sin(Teta(j2))^P0_tr(k,7)*sin(Teta(j3))^P0_tr(k,8);
                end
            end
        end
    end
end


Hier ist P0_tr unsere variable Matrix

Die Idee 'Vektorisieren' habe ich nicht verstanden. Wie funktioniert das?

Grüße
Farzad
Private Nachricht senden Benutzer-Profile anzeigen
 
outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 19.11.2007, 13:59     Titel:
  Antworten mit Zitat      
schau mal hier:

Beispielmatrix in der Größe 3x3x2
>> a = rand(3,3,2);
um alle Elemente Zeilenweise zu multiplizieren benutzstz Du PROD:
>> prod(a,2)
Um alle Elemente Spaltenweise zu addieren, kannst Du SUM benutzen:
>> sum(a,1)

Die Zahlen nach der Komma geben die Dimension an "entlang" welcher die Multiplikation oder Addition stattfinden soll.

Möglicherweise muss Du die die Funktion noch verschachteln
>> prod(prod(a,2),3)

Teste die Ergebnisse nach.

Ansonsten schaue auch die Funktion DIM an. Mit der Funktion kann die Dimension der MAtrix abgefragt werden.




MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
farzad73
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 17.11.07
Wohnort: ---
Version: 7.0
     Beitrag Verfasst am: 19.11.2007, 18:50     Titel:
  Antworten mit Zitat      
Ich danke dir für die tollen Tips.

Ich werde bald alles testen. Das kann bisscehn Zeit kosten. Ich melde mich wenn ich soweit bin.

Grüße

Farzad
Private Nachricht senden Benutzer-Profile anzeigen
 
basti123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2011, 02:27     Titel: dynamische for Schleife erweitert
  Antworten mit Zitat      
Zitat:
Ich habe eine Matrix, aber jedes mal (bei Ausführung) kann verschiedene Dimensionen haben und ich muss die Elemente dieser Matrix nach Zeilen, multiplizieren, und nach Spalten zusammenaddieren.


Ich habe ein ähnliches Problem.
Bei mir wird allerdings nichts addiert und auch nichts summiert. Ich will in der innersten Schleife jeweils eine Funktion zur Berechnung aufrufen und das Ergebnis dieser weiter nach oben, etc. reichen.

Code:

function recu(dim)
a = dim;    
    for b=a+1:numFeatures
        pos = pos +1;  
        v(:,1)  = values(:,a);
        v(:,2)  = values(:,b);
       
        dist = createDistanceMatrix(v);        
        zwd = calculateZWD(dist);        
        cluster = generateCluster(dist, zwd);      
        allClusValues(:,pos) = cluster;
        recu(dim-1)
    end
 


Dabei ändert sich allClusValues ebenfalls und wird mit jeder Dimension größer.
Jetzt kommt der Tricky part:


Code:

v(:,1)  = values(:,a);
v(:,2)  = values(:,b);


sind ebenfalls von der Dimension abhängig.
Sagen wir dim=2, dann gibt es genau diese beiden Matrizen. Ist dim allerdings 3, so kommt ein weiterer hinzu...

Code:

v(:,1)  = values(:,a);
v(:,2)  = values(:,b);
v(:,3)  = values(:,???);


Die inneren Funktionen createDistanceMatrix(v), calculateZWD(dist) sind so ausgelegt, dass ihnen die Anzahl der v's egal ist...

Fall jemand eine Idee oder einen Tipp hat, dann wär ich sehr dankba.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.03.2011, 12:52     Titel: Re: Dynamische for-Schleife ?
  Antworten mit Zitat      
Hallo farzad73,

Was Du durchführst ist eigentlich eine Permutation mit Wiederholungen und Reihenfolge. Das liesse sich z.B. mit VChooseKRO lösen:
http://www.mathworks.com/matlabcent.....exchange/26242-vchoosekro
Damit könntest Du alle Indices als Matrix erstellen und diese dann Zeile für Zeile abarbeiten:
Code:
N = 4;
M = 2;  % Anzahl der Spalten
D = VChooseKRO(1:N, M);
for i = 1:size(D, 1)
  i1 = D(i, 1);
  i2 = D(i, 2);
  ...
end

Das läßt sich aber auch manuell implementieren:
Code:
N = 4;
M = 2;  % Anzahl der Schleifen
D = ones(1, M);

ready = false;
while ~ready
  disp(D);
  ... % Your action happens here with current data of D vector
 
  % Find the next permutation:
  index = M;
  ready2 = false;
  while ~ready2
     D(index) = D(index) + 1;
     if D(index) < N
        ready2 = true;
     elseif index > 1
        D(index) = 1;
        index = index - 1;
     else  % All permutations found:
        ready2 = true;
        ready = true;
     end
   end
end

Viel Erfolg, Jan
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.