bin noch relativ frisch mit Matlab unterwegs und möchte ein Gleichungssystem iterativ lösen. Der Lösungsalgorithmus ist prinzipiell gegeben bzw. wird für meine Anwendung in der Literatur als ideal beschrieben. Dabei ist r der Vektor der Unbekannten und A ist die Koeffizientenmatrix. Die Originaldaten kann ich leider nicht raus geben. Zunächst habe ich das ganze mit geschachtelten for-Schleifen realisiert, dabei ist die Rechenzeit aber durch die Decke gegangen. Ich habe versucht die Rechnung zu vektorisieren, dabei ist der folgende Code entstanden und die Rechenzeit um Faktor 270 nach unten gegangen.
Dennoch gibt es bestimmt noch Optimierungspotential, daher meine Frage: Was kann man besser und idealerweise noch schneller machen? Best Practices?
Außerdem hätte ich gerne den Progressfortschritt angezeigt. Mittels waitbar geht hier die benötigte Zeit aber wieder stark nach oben. Alternativ habe ich den counter für die Iterationen im Command-Window anzeigen lassen aber selbst das erhöht meine Rechenzeit deutlich.
Code:
%----- Random Zahlenwerte
z=rand(170,1);
r=ones(540,1)*0.005;
A=rand(170,540);
% ----- Initialisierung
count=0;
count_max=10000;
%----Vorberechnung einzelner Terme
T=(1./sum(A(:,1:540)))';
T2=bsxfun(@times, A, z);
Der größte Gewinn wäre es natürlich, die Schleife abzubrechen, wenn r sich nicht mehr relevant ändert. Aber der Code lässt sich noch deutlich vereinfachen:
wow, hätte nicht gedacht das man hier noch so viel rausholen kann! Vielen Dank!
Bei meinem System Win7/64, i7-4800MQ, Matlab 2013a hat sich die Rechenzeit von 3.9 auf 0.42s verkürzt.
Bezüglich des Schleifenabbruchs hast du natürlich recht, ich hatte auch geplant ein Abbruchkriterium einzubauen. Das ist relativ simpel da
Hat evtl. noch jemand Anmerkungen bzgl. einer Anzeige des Iterationsfortschritts mit möglichst geringem Rechenaufwand (siehe Eingangspost). Mein reales System kann beliebig groß werden (Messdaten) und i.d.R. sind relativ viele Iterationen notwendig, dementsprechend kann die Rechenzeit u.U. Stunden betragen.
Eine Alternative ist
now
zu verwenden um die WAITBAR etwa einmal pro Sekunde zu upzudaten. Das hilft in Fällen, in denen auf jede 1000ste Iteration zu häufig ist, oder viel zu selten.
Gruß, Jan
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.