2010-06-25 12 views
12

Ich bin sehr neu zu MATLAB und ich versuchte, ein Echtzeit-Diagramm einiger Berechnungen anzuzeigen. Ich habe eine N Größe Vektor und ich arbeite mit m Werte auf einmal (sagen m = N/4), so dass ich die ersten m Werte plotten möchte und dann, sobald die zweiten m Werte berechnet haben, haben sie ersetzen die erste Handlung.Echtzeit-Plot in MATLAB

Mein Ansatz war wie folgt:

for i=1:N, 
    ... 
    //compute m 
    ... 
    plot(m); 
end; 

aber es funktioniert nicht, die Handlung in jeder Schleife und wartet auf alle Schleifen bis Ende zu aktualisieren, um die Daten zu zeichnen. Meine Frage ist: Sollte ich eine andere Funktion anstelle von plot verwenden oder könnte ich etwas Verzögerung in jeder Schleife hinzufügen?

Ich denke, es muss einen Weg geben, den ich nicht kenne, um den Plot zu aktualisieren, anstatt ihn jedes Mal neu zu plotten.

+0

In Verbindung stehend: https://Stackoverflow.com/questions/13102654/how-should-i-update-the-data-of-a-plot-in-matlab –

Antwort

11

Sie können einen Anruf zu DRAWNOW hinzufügen, um das Aktualisieren des Diagramms zu erzwingen. Siehe reference page. Beachten Sie, dass DRAWNOW bewirkt, dass die Grafik-Ereigniswarteschlange geleert wird, was dazu führen kann, dass Callbacks usw. ausgeführt werden.

+0

Es ist einige Zeit jetzt gewesen, aber Sie konnten wollen DoubleBuffering zu betrachten und zu verwenden. Ich erinnere mich nicht, wo ich diese Option einstellen sollte - aber es hat zu dieser Zeit einen Unterschied gemacht :) – Chau

+2

Double Buffering ist eine Eigenschaft der Figur - "set (gcf, 'DoubleBuffer', 'on')" oder ähnliches. Könnte auch helfen, aber Sie brauchen ein DRAWNOW um das Update zu erzwingen. – Edric

+0

Tatsächlich fehlte mir der drawnow Befehl. Danke vielmals. – kirbuchi

29

Als Edric mentioned, werden Sie auf jeden Fall einen drawnow Befehl nach dem Aufruf an plot hinzufügen, um eine Aktualisierung der Grafiken zu erzwingen. Es gibt jedoch eine viel effizientere und glattere Methode zur Animation von Diagrammen, bei der nicht jedes Mal das gesamte Diagramm neu erstellt wird. Sie können Ihr Diagramm einfach initialisieren, ein handle für das Plotobjekt erfassen und dann die Eigenschaften dieses Objekts in Ihrer Schleife mit dem Befehl set ändern. Hier ein Beispiel:

hLine = plot(nan);   % Initialize a plot line (which isn't displayed yet 
          % because the values are NaN) 
for i = 1:N    % Loop N times 
    ... 
    % Compute m here 
    ... 
    set(hLine, 'YData', m); % Update the y data of the line 
    drawnow     % Force the graphics to update immediately 
end 

Zusätzlich vor der Schleife und nach dem Aufruf von plot Sie eine Reihe von axes properties festlegen können, wie die axes limits usw., wenn Sie die Achsen wollen fixiert bleiben und nicht ihre ändern Aussehen mit jedem neuen Vektor m, die geplottet wird.

+0

Danke, das hat den Trick gemacht! Sowohl Ihre als auch Edrics Lösung hat sehr gut funktioniert. Aber wenn ich es auf Ihre Weise mache, muss es nicht jedes Mal neu aufgelegt werden. – kirbuchi

+0

@kirbuchi Warum ist das nicht die akzeptierte Antwort? – vvy

+0

@vvy Ich akzeptierte die andere, da sie zuerst kam und half mir mein Problem zu lösen, aber ich erkannte dann, dass es besser war. Ich denke, die Anzahl der Stimmen spricht für sich. – kirbuchi