matlab做图加上数值,如何在Matlab中更新绘图数据?

18a88f1fe8d91a317546cc7994d00609.png

POPMUISE

简短的回答:经常使用 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)-refreshdatafunction 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');endM-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 refreshobjs = {};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  endend假设您没有一个图,但是有100个图,而您只想更新第一个图。这将非常慢,因为对于每个图,您都会尝试找到所需的图!(我将作为练习供读者弄清楚是什么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秒。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值