3 回答

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秒。

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

TA貢獻1909條經(jīng)驗 獲得超7個贊
假設(shè)我想用新數(shù)據(jù)更新繪圖。我應(yīng)該選擇哪種方法?
如果給定軸上有多個線對象,則方法:
將XDataSource屬性設(shè)置為某些名稱,更新變量,然后調(diào)用
refreshdata
將在MATLAB R2012b中生成錯誤。Andrey的答案中提供了一個適當(dāng)?shù)氖纠?/p>
已將一個錯誤提交給Mathworks。
- 3 回答
- 0 關(guān)注
- 1364 瀏覽
添加回答
舉報