Verfasst am: 24.10.2016, 19:03
Titel: Video erstellen dauert unglaublich lang!!
Hallo,
ich habe folgendes Problem: ich habe mir eine for-Schleife zur Erstellung eines Videos geschrieben, funktioniert auch alles problemlos. Das einzige Problem ist, dass MATLAB einen ganzen Tag zur Erstellung des Videos braucht.
Ich hoffe ihr könnt mir helfen!!!! Wäre euch sehr dankbar!!!
Mangels daten können wir Deinen Code nicht alufen lassen und so nur raten, wo das Problem liegt. Vielleicht erzeugst Du laufend neue GUI-Objekte ohne die vorherigen zu löschen. Dann würden die ersten Bilder noch schnell erstellt werden und dann wird Matlab von Bild zu Bild langsamer. Ist das so?
Welche Zeilen benötigen die meiste Rechenzeit? Der Profiler hilft Dir, das heraus zu finden.
Vielen Dank für die Hilfe!
Ich habe nun die entsprechende Änderung nach euren Vorschlägen durchgeführt. Das Skript läuft nun besser aber immer noch langsam.
Der Profiler bestimmt mir folgende Rechenzeiten: siehe Dokument 1 und 2
(profile on; untitled; profile viewer)
Es scheint also an "getframe" zu liegen!
Welche Möglichkeiten gibt es noch? Anbei nochmals die entsprechenden Skripte und Vektoren:
Das Problem versteckt sich nur hinter
getframe
, liegt aber eigentlich wo anders: Du erstellst in jeder Iteration ein neues Grafik-Objekt mit
plot
bzw.
patch
. Das verbraucht sehr viele Resourcen und das ist spürbar, weil der Code immer langsamer läuft. Ein typisches "Shlemiel The Painter"-Problem (frage Google).
getframe
wird nur deshalb so langsam, weil es alle gezeichneten grafischen Objekt updated.
Die Lösung ist, einfach nicht so viele neue Grafik-Objekte zu erstellen, sondern die vorhandenen zu erweitern. Zudem muss der Titel der Grafik nicht immer wieder gesetzt werden. Die Ausgabe des
set
Befehln im Command-Window frisst ebenfalls Zeit, ohne einen Nutzen zu haben.
for i = 1:n
%EXTEM
y_cell_EXTEM=clot_EXTEM(1:i);
x_cell_EXTEM=time_EXTEM(1:i);
y_EXTEM=(cell2mat(y_cell_EXTEM)-1.5);
x_EXTEM=cell2mat(x_cell_EXTEM)/60;
if x_EXTEM(end)<=CT_extem(k)/60 % set(f); set(line1, 'XData', x_EXTEM, 'YData', y_EXTEM);
end
Noch eine letzte Frage.
Bisher ist es ja so, dass der erste Teil des Clots magenta gefärbt ist (if x_EXTEM(end)>(CT_extem(k))/60 && y_EXTEM(end)<=20) und der zweite blau (if x_EXTEM(end)>(CT_extem(k))/60 && y_EXTEM(end)>20). Der erste Teil des Clots soll auch weiter magenta gefärbt sein, aber eben nur so lange, bis die zweite if-Bedinung gilt (if x_EXTEM(end)>(CT_extem(k))/60 && y_EXTEM(end)>20). Sobald die zweite if-Bedingung gilt soll der zuvor magenta gefärbte Teil auch blau eingefärbt werden.
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.