2012-04-05 62 views
5

我正在將大量數據打印爲.png文件。每張圖都是數據矩陣中一列的圖,我將這些.png文件串在一起成爲一個動畫。爲什麼在打印大量(.png)數字時MATLAB會變慢?

我的問題是,前幾百張圖像打印速度很快,但創建每個新圖的時間量迅速增加,從前幾百個.png文件的大約0.2秒到大約第800個處的2秒或更長數字。

腳本運行期間內存使用量增加,但每隔幾秒左右只增加1MB。這是在Windows上運行R2009b 64位。

我的代碼看起來是這樣的:

n = 1000; 
matrix = rand(n); 

f = figure('Visible','off'); % create the figure 

for i_ =1:n 
    plot(1:n,matrix(:,i_)); 
    ylim([0 1]); 
    set(f,'PaperUnits','inches','PaperPosition',[0 0 6 4]); 
    png_name = [ 'img/timestep_' sprintf('%05d',i_) ]; 
    print('-dpng', png_name); 
end 
+0

你一次只能做500個嗎?有一個服務,將重新啓動您的應用程序? – 2012-04-05 16:12:07

+3

我無法強調這一點...... MATLAB內置了一個美妙的分析器,您應該定期使用它。分析有助於識別許多此類問題。 – linuxuser27 2012-04-05 17:39:08

回答

4

儘量不要再生的情節,但僅在每次迭代改變XDataYData屬性:

set(f,'PaperUnits','inches','PaperPosition',[0 0 6 4]); 
h = plot(1, matrix(:,1)); 
ylim([0 1]); 

for i_ = 1:n 
    set(h, 'XData', 1:n, 'YData', matrix(:,i_)) 
    png_name = sprintf('img/timestep_%05d',i_); 
    print('-dpng', png_name); 
end 

另一項建議。如果你想創建一個動畫,你爲什麼生成PNG文件?使用GETFRAME並直接在MATLAB中編寫MOVIE

2

這看起來像是內存泄漏。您可以通過創建循環中的每個圖形來幫助Matlab釋放泄漏的內存。

for i = 1:n 
    f = figure; 
    % plot 
    % print 
    close(f) 
end 

更新:Here's a question and answer說,這項技術的工作原理。

+0

沒試過,但如果關閉一張圖片並製作一張新圖片需要一些時間,那麼只考慮每100張圖片就做一次。 – 2013-09-06 16:10:03

相關問題