WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Video erstellen dauert unglaublich lang!!

 

brauni
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 28.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2016, 20:03     Titel: Video erstellen dauert unglaublich lang!!
  Antworten mit Zitat      
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!!!

LG

untitled14.m
 Beschreibung:

Download
 Dateiname:  untitled14.m
 Dateigröße:  5.63 KB
 Heruntergeladen:  247 mal
Werte.mat
 Beschreibung:

Download
 Dateiname:  Werte.mat
 Dateigröße:  215.42 KB
 Heruntergeladen:  242 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.10.2016, 02:54     Titel: Re: Video erstellen dauert unglaublich lang!!
  Antworten mit Zitat      
Hallo brauni,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.10.2016, 10:15     Titel:
  Antworten mit Zitat      
Hallo,

Jan, mit der Werte.mat ist der Code ausführbar.

Die Langsamkeit des Codes liegt in der Tat daran, dass sehr viele (Tausende) graphische Objekte erzeugt werden.

Statt
Code:
plot(x1, y1)
hold on
plot(x2, y2)

wäre besser
Code:
p = plot(x1, y1);
set(p, 'XData', [p.XData, x2], 'YData', [p.YData, y2])


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.10.2016, 19:30     Titel:
  Antworten mit Zitat      
Hallo Harald,

Zitat:
Jan, mit der Werte.mat ist der Code ausführbar.

Oh, ja, natürlich. Ich hatte nur das M-File geöffnet und das MAT-File übersehen.

Danke, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
brauni
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 28.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2016, 18:02     Titel:
  Antworten mit Zitat      
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:

Vielen Dank!!

LG

Werte.mat
 Beschreibung:

Download
 Dateiname:  Werte.mat
 Dateigröße:  215.42 KB
 Heruntergeladen:  265 mal
untitled.m
 Beschreibung:

Download
 Dateiname:  untitled.m
 Dateigröße:  1.24 KB
 Heruntergeladen:  255 mal
Dokument 2.pdf
 Beschreibung:

Download
 Dateiname:  Dokument 2.pdf
 Dateigröße:  85.01 KB
 Heruntergeladen:  705 mal
Dokument 1.pdf
 Beschreibung:

Download
 Dateiname:  Dokument 1.pdf
 Dateigröße:  48.54 KB
 Heruntergeladen:  759 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.10.2016, 12:52     Titel:
  Antworten mit Zitat      
Hallo,

movie2avi soll laut Doku nicht mehr verwendet werden, stattdessen VideoWriter (wofür kein getframe notwendig ist).

Ansonsten wäre die Frage, ob man wirklich in jeder Iteration einen Frame aufnehmen muss.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.10.2016, 23:10     Titel:
  Antworten mit Zitat      
Hallo brauni,

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.
Code:
%EXTEM
k=1;

%Skalierung Plot
p=65;

clot_EXTEM=num2cell(clot_ex{:,k});
time_EXTEM=num2cell(time_ex{:,k});

n = length(clot_EXTEM);

AxesH = subplot(2,2,1);
set(AxesH, 'nextplot', 'add');
axis([0 35 -p p]);
title('EXTEM');
xlabel('time [min]');
ylabel('clot [mm]');
grid on

% Dummy-Objects - overwritten soon:
line1  = plot(1, 1, 'm');
patch1 = patch(1, 1, 'm', 'edgecolor', 'm', 'Parent', AxesH);
patch2 = patch(1, 1, 'b', 'edgecolor', 'b', 'Parent', AxesH);

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
   
   %Ab hier: CLOT
   if x_EXTEM(end)>(CT_extem(k))/60 && y_EXTEM(end)<=20
      length_EXTEM_x=length(x_EXTEM);
      length_EXTEM_y=length(y_EXTEM);
      % f=patch([x_EXTEM'; x_EXTEM'],[y_EXTEM'; -y_EXTEM'],'m','edgecolor','m');
      % set(f);
      set(patch1, 'XData', [x_EXTEM'; x_EXTEM'], 'YData', [y_EXTEM'; -y_EXTEM']);
   end
   
   if x_EXTEM(end)>(CT_extem(k))/60 && y_EXTEM(end)>20
      x_EXTEM_=x_EXTEM(length_EXTEM_x:end);
      y_EXTEM_=y_EXTEM(length_EXTEM_y:end);
      % r=patch([x_EXTEM_';x_EXTEM_'],[y_EXTEM_';-y_EXTEM_'],'b','edgecolor','b');
      % set(r);
      set(patch2, 'XData', [x_EXTEM_';x_EXTEM_'], 'YData', [y_EXTEM_';-y_EXTEM_']);
   end
   
   if x_EXTEM(end)>20;
      break
   end
   
   drawnow;
   M(i)       = getframe(gcf);
   M(i).cdata = flipud(M(i).cdata);
end
 

Und plötzlich läuft das in ein paar Sekunden. :-)

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
brauni
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 28.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2016, 11:25     Titel:
  Antworten mit Zitat      
Super! Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
brauni
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 28.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2016, 20:48     Titel:
  Antworten mit Zitat      
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.

Vielen, vielen Dank!

LG
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.11.2016, 14:35     Titel:
  Antworten mit Zitat      
Hallo brauni,

Die wiederholte Umwandlung von CELLs in Arrays verwirrt mich. Ist das wirklich hilfreich?

Wenn due die Farbe ändern möchtest, fügre das einfach in Deinen Code ein. Ich vereinfache mal ein wenig:
Code:
  if x_EXTEM(end) <= CT_extem(k)/60
      set(line1, 'XData', x_EXTEM, 'YData', y_EXTEM);
   else
     if y_EXTEM(end) <= 20
       length_EXTEM_x=length(x_EXTEM);
       length_EXTEM_y=length(y_EXTEM);
       set(patch1, 'XData', [x_EXTEM'; x_EXTEM'], 'YData', [y_EXTEM'; -y_EXTEM']);
     else
       x_EXTEM_=x_EXTEM(length_EXTEM_x:end);
       y_EXTEM_=y_EXTEM(length_EXTEM_y:end);
       set(patch2, 'XData', [x_EXTEM_';x_EXTEM_'], 'YData', [y_EXTEM_';-y_EXTEM_']);
       set(patch1, 'edgecolor', 'm');
     end
  end

Das färbt jetzt den ersten Teil in jeder weiteren Iteration ein, aber das vergörßert die Laufzeit wohl nicht messbar.

Es lässt sich noch weiter vereinfachen:
Code:
  if x_EXTEM(end) <= CT_extem(k)/60
      set(line1, 'XData', x_EXTEM, 'YData', y_EXTEM);
   else
     if y_EXTEM(end) > 20
       set(patch1, 'edgecolor', 'm');
     end
     set(patch1, 'XData', [x_EXTEM'; x_EXTEM'], 'YData', [y_EXTEM'; -y_EXTEM']);
  end

Denn das 2. PATCH-Objekt brauchst Du dann ja gar nicht, oder?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
brauni
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 28.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.11.2016, 21:56     Titel:
  Antworten mit Zitat      
Sehr gut! Danke für die Vorschläge!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.