Matlab实时情节

时间:2011-11-26 12:22:34

标签: matlab

我是matlab的新手,我想实时绘制一些数据。 我的方法如下:

figure;
hold on;

for i = 1:1000;
   plot(i, i);
   drawnow;
end

但表现不佳。

我还在stackoverflow上找到了一个建议:https://stackoverflow.com/q/3118918/1066838 但是只绘制了最后设定的数据,所以我看到图中只有一个点。

2 个答案:

答案 0 :(得分:21)

请考虑在循环中调整line handle properties,更具体地说plotXData,而不是进行高级YData调用:

figure(1);
lHandle = line(nan, nan); %# Generate a blank line and return the line handle

for i = 1:1000
    X = get(lHandle, 'XData');
    Y = get(lHandle, 'YData');

    X = [X i];
    Y = [Y i];

    set(lHandle, 'XData', X, 'YData', Y);
end

这样做,代码前/后的tic / toc给出0.09秒;你可能已经看到了一个天真的plot,它的运行时间接近20秒。

请注意,我在此示例中仅使用get来生成数据集;我假设你有一个实时情节,你有一些DatasetXDatasetY来绘制,所以你需要相应地处理你的数据。但最后,一旦你有了想要在特定时间绘制的数据集,只需set该行的整个XDataYData

最后,请注意,对于非常大的数据集,此set调用有点笨拙,因为我们必须每次都设置行数据而不是追加到它。 (但它肯定比使用plot更快。)这可能足够好,具体取决于数据集更改的频率。有关详细信息,请参阅this question


编辑:从MATLAB R2014b开始,animinatedline对象可以更容易地绘制来自流数据的点:

  

动画线对象通过累积来自流数据源的数据来优化线动画。使用animatedline函数创建初始动画线后,可以向线添加新点,而无需重新定义现有点。通过设置其属性来修改动画线的外观。

答案 1 :(得分:0)

为了提高性能你应该使用clf,它会清除数字。否则所有的情节都会叠加在一起。

如果你想实时plot(x,y),你应该这样做:

figure;
hold on;

for i = 1:1000;
   clf;
   plot(x(1:i), y(1:i));
   drawnow;
end