2012-12-05 44 views
3

所以我在MATLAB一個簡單的循環,執行以下操作:試圖讓MATLAB的身影停止「閃爍」

for p = 1:100 

    x = 4.*randn(1,100); 
    y = 7.*randn(1,100); 

    figure(1) 
    plot(randn(1,100)); 

    figure(2); 
    plot(randn(1,100)); 

end 

x和y是編造的,但是這是它的JIST。無論如何,當我運行這個代碼時,毫不奇怪,MATLAB會做出兩個數字並相應地進行繪圖。問題是,當我這樣做時,我在數字之間出現了一種「閃爍」,並且它使得看到x和y的質量隨着時間的推移而變得更差。

我發現了一種方法,使情節更加平滑像這樣的一個:

figure(1); 
for p = 1:100 

    x = 4.*randn(1,100); 
    y = 7.*randn(1,100); 

    plot(randn(1,100)); 
    drawnow 

end 

如果我這樣做,那麼當然圖(1)將繪製得非常順利出很好的x,無圖(1) '眨眼間',但現在我不能顯示圖(2)或y!

如何在不同的數字(而不是子圖)上平滑地顯示這兩個數量而不閃爍?

編輯:

測地感謝你的回答,解決方案的工作,但有是,我沒有想到會是一個問題,一個微妙的,但它是。

1)我無法在此解決方案中使用'imagesc'。

例如,

figure(1); 
aone = axes; 
figure(2); 
atwo = axes; 

for p = 1:100 

    x = 4.*randn(1,100); 
    y = 7.*rand(10,100); 


    plot(aone,x); 
    drawnow; 
    imagesc(atwo,y); 
    drawnow; 
end 

在這種情況下用於imagesc的部分(Â雙,y)的崩潰。

回答

9

您的閃爍是因爲您通過循環一次又一次地生成每個圖形窗口,這迫使窗口每次都到達前臺。首先生成的數字,附加一些軸給他們,你的數據繪製各軸,像這樣:

figure(1); 
aone = axes; 
figure(2); 
atwo = axes; 
for p = 1:100 

    x = 4.*randn(1,100); 
    y = 7.*randn(1,100); 


    plot(aone,randn(1,100)); 
    drawnow; 
    imagesc(y,'Parent',atwo); 
    drawnow; 
end 

編輯:像plot功能直接採取的軸說法,但imagesc沒有。在這種情況下,你需要發送一個Property Name/Value作爲參數。生成圖像的'父'將是我們的軸atwo(見上文)。

+0

感謝Geodesic。你能否詳細說明究竟是在做什麼?我閱讀文檔,但我仍然不確定它在做什麼。謝謝! – Spacey

+0

本質上它迫使Matlab在代碼執行過程中更新數字窗口。如果您將drawnow命令從此循環中取出,您會發現兩軸上確實有輸出,但很可能您只會看到p = 100值(而不是for循環中的每組值) 。有可能你的電腦運行這個例子的速度太快了,你看不到這個。將p更改爲1:1000或1:10000,您應該明白我的意思。 – Geodesic

+0

大地測量,感謝您的回答,但是有一個微妙的問題正在成爲一個問題,即使我認爲它不會。我已經編輯了相應的問題。 – Spacey

1

對於p = 1,請使用plot命令或imagesc命令創建您需要的圖。通過獲取輸出參數來保持生成的圖形對象的句柄:例如h = plot(....h = imagesc(....。這將是一個Handle Graphics lineseriesimage對象或其他東西,具體取決於您創建的特定繪圖類型。

對於p = 2:100,不要直接使用繪圖命令,而應更新原始手柄圖形對象h的相關Data屬性。例如,對於plot命令產生的lineseries對象,請將其XDataYData屬性設置爲新數據。對於imagesc命令產生的image對象,請將其CData屬性設置爲新圖像。

如有必要,更新後調用drawnow以強制刷新圖形隊列。

+0

謝謝你的工作就像一個魅力。一旦'h = imagesc(zeros(10,10))'被創建,'cdata'被設置爲10x10?至少似乎是這種情況。我不能用不同尺寸的圖像。無論如何,這不是一個問題,只是我觀察到的。 – Spacey