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?
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.
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...
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.
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
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.
Ich werde bald alles testen. Das kann bisscehn Zeit kosten. Ich melde mich wenn ich soweit bin.
Grüße
Farzad
basti123
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.03.2011, 02:27
Titel: dynamische for Schleife erweitert
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);
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...
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
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
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
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.