Verfasst am: 10.08.2010, 18:17
Titel: wie vektorisieren?
Hallo zusammen,
ich versuche die performance meines Codes zu steigern und möchte meine for-Schleifen vektorisieren. Ich habe nur ein Problem - es klappt nicht. Wie kann ich sowas vektorisieren?
danke für den Hinweis Ich werde das dann gleich ausprobieren und berichten. Aber was macht eigentlich dieses cat? und funktioniert das auch, wenn ich zu der if noch eine weitere elseif Anweisung verwende?
es scheint für meine if-Anweisungen nicht zu funktionieren. Ich habe es mit einfachen arrays ausprobiert, aber habe einige schwierigkeiten bei der umsetzung der systematik. Aber danke für die Hinweise
CAT erklärt Dir am besten "help cat". Es fasst zwei oder mehr Arrays zu einem gemeinsamen zusammen.
Die "logical indexing" Methode funktioniert auch bei ELSEIF Bedingungen. Bei großen Arrays ist das in Matlab dramatisch schneller als ein Haufen von FOR-Schleifen (im Allgemeinen, Ausnahmen gibt es auch). Wenn es bei Dir nicht klappt, poste doch mal Deinen Code, denn "logical indexing" ist so praktisch, dass man es können sollte.
ich möchte den folgenden code durch die indizierung ersetzen, weil er sehr, sehr langsam läuft. Vielleicht kannst du es mir an einem einfachen Beispiel noch einmal illustrieren. Das wäre klasse.
Code:
u(:,1,:)=x(:,1,:);
u=[u; uu];
for k=1:b; % Beginne im Pfad b for j=2:T; % in der Zeitstufe j for i=2:n; % im Zustand j
der Code ist nicht gerade ein einfaches Beispiel, an dem man das logical indexing hübsch demonstrieren könnte. Das sieht eher nach einer Indexschlacht aus...
Ich versuche es mal zumindest für k:
Code:
u(:,1,:)=x(:,1,:);
u=[u; uu];
for k=1:b; % Beginne im Pfad b for j=2:T; % in der Zeitstufe j for i=2:n; % im Zustand j
k = reshape(u(:, j-1, 1:b), n, b);
index1 = (k(i-1, :) == 1);
u(i,j, index1) = x(i,j,index1);
index2 = (k(i, :) == 2);
u(i,j, index2) = x(i,j, index2);
index3 = (k(i+1, :) == 3);
u(i, j, index3) = x(i,j, index3);
u(i, j, not(index1 | index2 | index3)) = -inf;
end;
... end end
Nimm das mal als Startpunkt. Laufen lassen kann ich das nicht, da mir die Daten fehlen. Es wird auch nur ein Laufindex ersetzt, aber das sollte das Programm schon mal deutlich beschleunigen.
Die "1:b" kannst Du durch ":" ersstzen, falls die Dimension passt.
Insgesamt macht das aber nicht den eindruck effizient zu sein. Ich vermute stark, dass sich da ganze in wenigen Zeilen erledigen lässt, aber der Code-Ausschnitt macht mir nicht ganz klar, was Du berechnen willst.
nee, also das versteh ich nicht, wieso wird k denn dann durch reshape u definiert - wenn k auch in der Schleife läuft? kompliziert! Vielleicht beschreibe ich einfach was ich machen möchte:
ich habe einen Array x, in dieser stehen nur die Werte 1,2,3 oder -inf.
also bei einer 2 soll er in j+1 in der selben Zeile bleiben
bei einer 3 soll er in j+1 um eine Zeile noch oben rücken
bei einer 1 soll er in j+1 um eine Zeile nach unten rücken.
danke für die viele Mühe, die du dir da gemacht hast; ich werde die Dinge erst einmal ausprobieren. So vereinfachen, wie du es beschrieben hast, lässt sich das ganze leider nicht. Ich probiere es mal aus, ich habe noch so eine for-schleife, die ich auf diese Art wegbekommen muss. gerade die k-for-schleife ist sehr zeitintensiv. für k=1:1000 (und das ist die untere Grenze) rechnet er mehr als 12 Stunden (ich habe bis jetzt immer abgebrochen). die i for-schleife geht max. bis 200 und die j for-schleife max. bis 365. Sitze jetzt schon die ganze Woche an dem Problem - ohne fortschritt !
ich habe es ein bisschen modifziert, weil ich noch eine Zeile an den u-Array angefügt habe. Aber es funktioniert! Vielen Dank. Ich probiere es jetzt noch für meine anderen for-Schleifen aus. Falls ich probleme habe, poste ich die dann hier noch mal.
Also für die Anwendung mit if-Anweisungen habe ich es verstanden. Jetzt sitze ich an dieser for Schleife - hier würde ich jetzt auch gerne die k-for-schleife eliminieren; das Problem ist, dass ein Index von CO durch b_out und b_in vorgegeben wird, was die Lösung des Problems erheblich erschwert. Ich habe versucht k über reshape neu zu sortieren, aber dann sind mir die ideen ausgegangen, wie ich das weiter verfolgen kann. Ich brauche den array CO am Ende wieder genau in der Form, wie es hier in dem Code steht.
Trotzdem ist die Rechenzeit immernoch sehr lang - ich konnte aufgrund der Dauer noch keinen Lauf bis zu Ende bringen. Ich habe jetzt 5 Schleifen die sich je mit einer i-for-Schleife und einer j-for-Schleife zusammen setzen mit i=1:100 und j=1:365 ... doch es dauert und dauert - was ist da noch zu machen?
Einstellungen und Berechtigungen
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.