MATLAB中的连续绘图

MATLAB中的连续绘图,matlab,plot,2d,line,Matlab,Plot,2d,Line,我的代码中有一个循环,我想画一些变量 在每次迭代中,我绘制一个新点,我希望它连接到上一个点 下面是一个示例代码(在这段代码中循环是不必要的,但在实际代码中不是) 对的就是我想要的 我曾想过使用行,但那会变得混乱(我必须更改I,并在每个行命令中使用4个点) 我似乎不是一个简单的问题,也许我遗漏了什么 谢谢你的帮助 我会用这一行替换您现有的绘图行 plot(t(1:i),s(1:i)); hold on; 这将绘制从索引1到当前索引的所有点。然后,通过删除“bo”,它将使用默认格式打印,这是您想

我的代码中有一个循环,我想画一些变量

在每次迭代中,我绘制一个新点,我希望它连接到上一个点

下面是一个示例代码(在这段代码中循环是不必要的,但在实际代码中不是)

对的就是我想要的

我曾想过使用
,但那会变得混乱(我必须更改
I
,并在每个
命令中使用
4个点)

我似乎不是一个简单的问题,也许我遗漏了什么


谢谢你的帮助

我会用这一行替换您现有的
绘图

plot(t(1:i),s(1:i)); hold on;
这将绘制从索引1到当前索引的所有点。然后,通过删除
“bo”
,它将使用默认格式打印,这是您想要的线条


最后,如果您希望在屏幕上实际设置动画(如电影),则需要在循环结束之前添加
drawnow
命令。您可能还希望在绘制后添加一个暂停(0.25)
,以插入四分之一秒的延迟,以便您的眼睛有机会在新绘制的图像被下一幅图像覆盖之前看到它。

您可以使用打印句柄,然后相应地更新属性“扩展数据”和“YData”。因此,可以在循环之前打印第一个点并生成打印句柄。之后,绘图手柄可用,可以在循环内调整绘图

n  = 500;
Fs = 1000;
f1 = 10;
t  = (0 : n - 1) / Fs;
s = zeros(size(t));
s(1) = sin(2 * pi * f1 * t(1));
figure
handle = plot(s(1), t(1), 'bo-'); %// the plot handle
for i = 2 : n
    s(i) = sin(2 * pi * f1 * t(i));
    set(handle, 'XData', t(1:i), 'YData', s(1:i)) %// update the plot data
    axis([0 t(end) -1 1]);
    pause(0.1) %// small pause to see animation
end

这与@Nras的答案类似,但速度更快,更容易阅读。我有几个程序可以做这类事情,根据计算循环的长度,图形更新实际上可能是一个重要而恼人的瓶颈

如果您知道向量的最终长度,可以预先分配绘图,然后使用以下命令进行更新:

MATLAB在计算限制时忽略“nan”,因此使用
nan
进行预分配使得调用
xlim
变得不必要。另外,当我运行此操作时,
暂停
是不必要的。您的里程可能会有所不同。我个人更喜欢这样做:

h = plot(t,emptyvec);
只要
t
是已知的,并且不会太长,这不仅让我了解了计算过程,还让我了解了一种进度条。如果它非常长,我可能会分块填充
t
,或者使用
XData
YData
作为循环缓冲区,使用
ii=mod(I,100)作为索引(例如),将产生示波器类型的效果。此外,不断重新计算轴限制也会造成时间损失

如果您不知道向量将有多长(例如,如果它在
while
循环中),您可以使用您知道将更长的向量预分配、分块分配,或者只执行循环缓冲区操作

对于多个绘图,对每一条额外的线预先分配
功能。与
绘图
不同,您可以直接将更原始的
函数包装到
句柄
函数中


请注意,如果您使用的是MATLAB 2014b或更高版本(我不是),那么新的HG2图形系统使用对象作为句柄,而不是双倍,因此将数字句柄转换为对象句柄的
handle
命令是多余的,可以直接使用点表示法。还要注意的是,这种方式使用的
handle

你能用它来代替这个循环吗?@excaza,没有我的
s
t
1x1
并且是在循环中计算的,我不想保存以前的值。“XData”和“Ydata”在Matlab中的使用效率更高,这意味着您将获得比我提出的方法快得多的动画。但是,惩罚是代码读起来有点复杂。如果你想要额外的性能,那就要付一点罚金。谢谢你的回答,但是我没有访问以前的
s
t
的权限。让我来编辑这个问题+1感谢您的回答,但我无法访问以前的
t
s
值。我编辑了这个问题,请看你有什么想法。很抱歉再次打扰你。如果我在每次迭代中有2个绘图点,我该怎么做?我可以使用同一个手柄吗?不可以,但是添加多个绘图很容易。请参阅我的编辑。请注意,如果您使用的是MATLAB 2014b或更高版本(我不是),那么新的HG2图形系统将对象用作句柄,而不是双重句柄,因此将数字句柄转换为对象句柄的
handle
命令是多余的。还请注意,以这种方式使用的
handle
是未记录的。
n  = 500;
Fs = 1000;
f1 = 10;
t  = 0;
dt = 1 / Fs;

s = nan(1,n);
emptyvec = nan(1,n);
h1 = plot(emptyvec,emptyvec,'-bo');
h2 = handle(line(emptyvec,emptyvec,'Color','r','Marker','x','LineStyle','--'));
h1 = handle(h1);


for i = 1 : n
    t = t + dt;
    s = sin(2 * pi * f1 * t);
    h1.XData(i) = t;
    h1.YData(i) = s;
    h2.XData(i) = t;
    h2.YData(i) = s^2;
    drawnow
end
h = plot(t,emptyvec);