亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Matlab中更新繪圖數據?

如何在Matlab中更新繪圖數據?

胡子哥哥 2019-12-27 10:11:52
假設我想用新數據更新繪圖。我應該選擇哪種方法?將XDataSource屬性設置為某些名稱,更新變量,然后調用refreshdata刪除原稿plot,然后plot再次調用命令。采用 Set('Xdata',...')
查看完整描述

3 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

簡短的回答:經常使用 Set('Xdata',...')。


示例代碼:


function PlotUpdate()   

    x = 0:.1:8;

    y = sin(x);

    h = plot(x,y);

    y = sin(x.^3);    

    set(h,'XData',x,'YData',y);

end

長答案:


有三種相關措施可供選擇一種最佳方法。


代碼清晰 -有人閱讀您的代碼有多容易?

運行時 -每種方法執行任務的速度有多快?

代碼可移植性 -您重構代碼的速度有多快?

現在,讓我們分析可能的方法。


方法(1)-refreshdata


function PlotUpdate()   

    x = 0:.1:8;

    y = sin(x);

    h = plot(x,y);

    set(h,'YDataSource','y')

    set(h,'XDataSource','x')

    y = sin(x.^3);

    refreshdata(h,'caller');

end

M-lint立即在生產線發出警告 y=sin(x.^3)


The value assigned to variable `y` might be unused

為什么會發生? refreshdata使用eval并且m-lint不知道您將使用y。有人閱讀您的代碼,不妨完全刪除此行。發生這種情況是因為您違反了封裝原理。refreshdata從調用者工作區訪問變量。另一種看待這種情況的方法是,假設您將繪圖的句柄傳遞給另一個函數。讀者不知道您為什么寫y = sin(x.^3);這本書,以及它與劇情的更新有何關系。


現在讓我們討論速度/運行時間。通過查看refreshdata源代碼,您會注意到兩個丑陋的for循環,它們遍歷您空間中的所有圖形處理變量。這是第一個:


% gather up all the objects to refresh

objs = {};

for k = 1:length(h)

  obj = h(k);

  objfields = fields(obj);

  for k2 = 1:length(objfields)

    % search for properties ending in DataSource

    if strncmpi(fliplr(objfields{k2}),'ecruoSataD',10)

      objs = {objs{:},obj, objfields{k2}};

    end

  end

end

假設您沒有一個圖,但是有100個圖,而您只想更新第一個圖。這將非常慢,因為對于每個圖,您都會嘗試找到所需的圖?。ㄎ覍⒆鳛榫毩暪┳x者弄清楚是什么ecruoSataD,以及如何使用它。)


即使將相關的圖作為參數,您仍然會有第二個循環,該循環運行eval了好幾次。效率不高。最后我將顯示時間比較。


結論:難以理解,難以重構,運行緩慢


方法(2)-刪除并重新繪制


function PlotUpdate()   

    x = 0:.1:8;

    y = sin(x);

    h = plot(x,y);

    set(h,'YDataSource','y')

    set(h,'XDataSource','x')

    y = sin(x.^3);          

    delete(h);

    h = plot(x,y);    

end

這種方法對讀者來說很清楚。您刪除了該圖,并繪制了一個新圖。但是,從最后的時間比較中可以看出,這是最慢的方法。


結論:易于理解,易于重構,運行速度非常慢


方法(3)-set('XData',...,'YData')


代碼真的很清楚。您想要修改繪圖的兩個屬性,XData和YData。而這正是您要做的。而且,代碼的運行速度非???,如下面的比較所示。


function PlotUpdate()   

    x = 0:.1:8;

    y = sin(x);

    h = plot(x,y);

    y = sin(x.^3);          

    set(h,'XData',x,'YData',y);

end

由于使用了新的圖形引擎hg2(R2014b及更高版本),因此,如果您喜歡該表示法,還可以使用屬性語法來指定數據:


function PlotUpdate()   

    x = 0:.1:8;

    y = sin(x);

    h = plot(x,y);

    y = sin(x.^3);          

    h.XData = x;

    h.YData = y;

end

結論:易于理解,易于重構,運行速度快


這是時間比較代碼


function PlotUpdateTimeCompare()    

    x = 0:.1:8;

    y = sin(x);

    h = plot(x,y);

    set(h,'YDataSource','y')

    set(h,'XDataSource','x')

    y = sin(x.^3);



    tic

    for i=1:100

        refreshdata(h,'caller');

    end

    toc 


    tic

    for i=1:100

        delete(h);

        h = plot(x,y);

    end

    toc     


    tic

    for i=1:100

        set(h,'XData',x,'YData',y);

    end

    toc 


end

結果:


經過的時間為0.075515秒。

經過的時間為0.179954秒。

經過的時間為0.002820秒。


查看完整回答
反對 回復 2019-12-27
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

您可以調用該函數drawnow并執行類似的操作:


h = plot(nan);


for i = 1:n

  y = ...

  set(h,'YData',y);

  drawnow                 %update the graph

end


查看完整回答
反對 回復 2019-12-27
?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

假設我想用新數據更新繪圖。我應該選擇哪種方法?

如果給定軸上有多個線對象,則方法:

  1. 將XDataSource屬性設置為某些名稱,更新變量,然后調用 refreshdata

將在MATLAB R2012b中生成錯誤。Andrey的答案中提供了一個適當的示例。

已將一個錯誤提交給Mathworks。


查看完整回答
反對 回復 2019-12-27
  • 3 回答
  • 0 關注
  • 1370 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號