hier ist ein Code mit 3 for-schleife.Die for loop dauert ewig wenn ich große Vektoren als input eingebe, deswegen möchte ich Vectorization verwenden. Leider krieg ich falsche Ergebnisse dafür.
habt Ihr ein Idee ... hier ist mein code.
Code:
na=5;
nb=10;
B=[255222];
for k=1:na
value = 0;
for i=1:nb
A(1)=1;
for j = 1:i
m = min(na,j);
A(j+1)=B(1:m)*A(j:-1:j-m+1)';
end;
value = value + A(end);
end end
ich kann mir nicht vorstellen, dass der Code so sinnvoll ist, da:
- value in jeder Iteration auf 0 zurückgesetzt wird
- A in jeder äußeren Iteration überschrieben wird
- k in der Schleife nicht verwendet wird.
Mir scheint, dass hier irgendeine Form von Glättung / Faltung durchgeführt wird; dafür können z.B. CONVN oder FILTER nützlich sein.
Grüße,
Harald
markC
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 20.06.2011, 12:56
Titel:
danke für die schnelle Antwort. A(1) ist ein initialisierungswert, und K ist eigentlich eine Vektor. ich habe versucht die zwei inneren For-Schreife umschreiben mit "meshgrid", aber kriege ich unterschiedliche Ergebnisse dafür. CONVN oder FILTER scheint nicht nützlich sein.
das Code ist ein vereinfachten Segment. Original Code sieht so aus(zu lang und aufwendig zu verstehen, deswegen habe ich es vereinfacht ). das Code realisierte das "Backpropagation though time" Methode.
Dies ist schonmal etwas schneller. Ich habe die wiederholte multiplikation mit -1 in "-a(..." nach außen gezogen und das MIN durch zwei Schleifen ersetzt. Statt immer wieder zu transponieren, wird der Vektor gleich in der richtigen Orientierung erzeugt. Für weitere Verbesserungen wäre es sehr hilfreich, die realistischen Dimensionen der Variablen zu kennen. Gerade bei der innersten Schleife wäre es wichtig zu wissen, ob "na" größer werden kann oder nicht.
Mit den bisherigen kleinen Änderungen komme ich von 0.87 auf 0.57 sec.
dsds = zeros(ki+1, 1);
for n = (na + nb + 1 + ki):len
for p = 1:ns
a = ad((p-1)*na+1:p*na);
nega = -a;
dydan = zeros(1, na);
for k=1:na
dsda = 0;
for i = 1:ki
dsds(:) = 0;
dsds(1) = 1;
for j = 1:na
dsds(j+1) = nega(1:j) * dsds(j:-1:1);
end
va = nega(1:na);
for j = na+1:i
dsds(j+1) = va * dsds(j:-1:j-na+1);
end
dsda = dsda + sd(n-k-i, p) * dsds(i+1);
end
dydan(k) = (-sd(n-k, p)-dsda) * dyds(p);
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.