第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何在Matlab中更新繪圖數(shù)據(jù)?

如何在Matlab中更新繪圖數(shù)據(jù)?

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

3 回答

?
POPMUISE

TA貢獻1765條經(jīng)驗 獲得超5個贊

簡短的回答:經(jīng)常使用 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

長答案:


有三種相關(guān)措施可供選擇一種最佳方法。


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

運行時 -每種方法執(zhí)行任務(wù)的速度有多快?

代碼可移植性 -您重構(gòu)代碼的速度有多快?

現(xiàn)在,讓我們分析可能的方法。


方法(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立即在生產(chǎn)線發(fā)出警告 y=sin(x.^3)


The value assigned to variable `y` might be unused

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


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


% 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

假設(shè)您沒有一個圖,但是有100個圖,而您只想更新第一個圖。這將非常慢,因為對于每個圖,您都會嘗試找到所需的圖!(我將作為練習(xí)供讀者弄清楚是什么ecruoSataD,以及如何使用它。)


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


結(jié)論:難以理解,難以重構(gòu),運行緩慢


方法(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

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


結(jié)論:易于理解,易于重構(gòu),運行速度非常慢


方法(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及更高版本),因此,如果您喜歡該表示法,還可以使用屬性語法來指定數(shù)據(jù):


function PlotUpdate()   

    x = 0:.1:8;

    y = sin(x);

    h = plot(x,y);

    y = sin(x.^3);          

    h.XData = x;

    h.YData = y;

end

結(jié)論:易于理解,易于重構(gòu),運行速度快


這是時間比較代碼


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

結(jié)果:


經(jīng)過的時間為0.075515秒。

經(jīng)過的時間為0.179954秒。

經(jīng)過的時間為0.002820秒。


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

TA貢獻1824條經(jīng)驗 獲得超8個贊

您可以調(diào)用該函數(shù)drawnow并執(zhí)行類似的操作:


h = plot(nan);


for i = 1:n

  y = ...

  set(h,'YData',y);

  drawnow                 %update the graph

end


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

TA貢獻1909條經(jīng)驗 獲得超7個贊

假設(shè)我想用新數(shù)據(jù)更新繪圖。我應(yīng)該選擇哪種方法?

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

  1. 將XDataSource屬性設(shè)置為某些名稱,更新變量,然后調(diào)用 refreshdata

將在MATLAB R2012b中生成錯誤。Andrey的答案中提供了一個適當(dāng)?shù)氖纠?/p>

已將一個錯誤提交給Mathworks。


查看完整回答
反對 回復(fù) 2019-12-27
  • 3 回答
  • 0 關(guān)注
  • 1364 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號