2015-04-29 31 views
0

有什麼理由讓MATLAB的drawnow不會刷新?MATLAB的drawnow不會刷新

這是我的代碼:

j=1; 
for k = 1:length(P) 
    for i = 1:n 
     plot(P(k,j),P(k,j+1),'.'); 
     j = j+2; 
    end 
    axis equal 
    axis([-L L -L L]); 
    j=1; 
    drawnow 
end 

rungekutta4是我自己的功能我寫的,它的工作原理確定,所以這個問題是不存在的。)

顆粒僅僅停留在畫每次循環執行時都不會被覆蓋。

我該如何解決這個問題?

+0

您可以在繪製之前刷新。試試'clf' –

+0

謝謝!我嘗試了它,它只動畫了一個粒子:/ – DoubleOseven

+0

它動畫了你畫的粒子數量!取決於你放在哪裏,當然。你需要把它放在'for i = 1:n'行之前。之後,寫一個「保持」。 –

回答

1

當你想動畫的東西,當然,你想,強制繪製。那是什麼命令drawnow是有。但還有其他的事情需要考慮!

其中之一是,你需要確保一切都畫在每一幀。爲此,在開始繪製(繪圖)之前使用hold on函數。

但是,您還需要確保在繪製之前清除圖像,否則圖將永久堆疊。使用clf「明確的數字command before the previously mentioned保持on`和將做的工作。

記住,如果動畫太快,你可以隨時添加一個pause(0.2)drawnow先快後慢的。

2

正確和有效的這樣做,這是與handle graphics。你也應該向量化你的plot命令。

% Example data to make runnable 
L = 1; 
n = 10; % Number of points 
P = 2*rand(1e2,n+1)-1; 

% Initialize plot, first iteration 
h = plot(P(1,1:n),P(1,2:n+1),'.'); % Plot first set of points and return handle 
axis equal; 
axis([-L L -L L]); 
hold on; % Ensure axis properties are fixed 
drawnow; 

% Animate 
for k = 2:size(P,1) % size is safer in this case 
    % Use handle to update the positions of the previously plotted points 
    set(h,{'XData','YData'},{P(k,1:n),P(k,2:n+1)}); 
    drawnow; 
    pause(0.1); % Slow down animation a bit to make visible 
end 

上的動畫的每個迭代調用clf和/或plot導致許多次已經在內存中被不必要地刪除和重新分配,導致代碼慢得多。在某些情況下,它也可能導致閃爍。請參閱this very similar question and answer

+0

是的,這個問題似乎定期回來。你真的需要「持有」聲明嗎?當我以同樣的方式回答同樣的問題時(已經幾次了),我也解釋了'plot'會重新創建一個圖並重新計算/重新調整所有的軸限制和其他屬性,同時使用'set' 'X/YData'只會更新那個,沒有別的,所以軸限制和其他屬性不會改變。 – Hoki

+0

@Hoki:你說得對,在這個簡單的例子中,你可能不需要它,但我還沒有在老版本的Matlab中進行過測試。不過,我經常把它放在那裏,因爲我最終可能會在動畫循環之前或之內插入其他命令,導致更改。 – horchler