在MATLAB中用for-loop绘制图形

在MATLAB中用for-loop绘制图形,matlab,for-loop,plot,graph,matlab-figure,Matlab,For Loop,Plot,Graph,Matlab Figure,我正在尝试使用for循环绘制一个简单的图,如下所示 x=linspace(0,2*pi,100); for i=1:numel(x) y=sin(x(i)); plot(x(i),y) hold on end 然而,我的身材上什么也没有。为什么会这样?为什么会这样。。。 使用绘图(x(i),y)可以绘制100个单点(每次迭代一个),默认情况下不会显示这些点。因此,情节看起来是空的 解决方案1:矢量化计算和直接绘图 我想你是想画一条连续的线。在这种情况下,不需要for循

我正在尝试使用for循环绘制一个简单的图,如下所示

x=linspace(0,2*pi,100);
for i=1:numel(x)
    y=sin(x(i));
    plot(x(i),y)
    hold on
end
然而,我的身材上什么也没有。为什么会这样?

为什么会这样。。。 使用
绘图(x(i),y)
可以绘制100个单点(每次迭代一个),默认情况下不会显示这些点。因此,情节看起来是空的


解决方案1:矢量化计算和直接绘图 我想你是想画一条连续的线。在这种情况下,不需要for循环,因为您可以在MATLAB中直接计算和绘制向量。因此,以下代码可能会满足您的需要:

x = linspace(0,2*pi,100);
y = sin(x);
plot(x,y);
请注意,
y
x
都是一个向量,
y(n)
等于
sin(x(n))
表示所有
n
。如果要绘制点本身,请在调用
plot
时使用-syntax,如下所示1:

1) 也可以使用其他类型的点,请参见上述链接文档


解决方案2:计算for循环中的值,然后进行绘图 如果要计算for循环中的值并随后进行打印:预分配所需变量(在本例中为
y
),计算for循环中的值,最后在计算后使用一个命令进行打印

x = linspace(0,2*pi,100);

y = zeros(size(x));
for i = 1:numel(x)
    y(i) = sin(x(i));
end

plot(x,y);

解决方案3:计算时动态更新绘图 如果您坚持在每次迭代中进行绘图,那么解决方案2中以前的代码可以按如下方式展开:创建一个地物,向其添加一个“空”绘图,并存储其句柄。在for循环中,计算值并将其添加到
y
-向量,如上所示。最后一步,您可以通过更改其
XData
YData
属性并调用
drawnow
来更新绘图。请注意,在for循环中每次调用
plot
都会带来不必要的开销,我不建议这样做

% create figure and plot
figure;
ph = plot(0,0);
ax = gca;
set(ax,'XLim',[0,2*pi]);
set(ax,'YLim',[-1,1]);

% calculate and update plot
x = linspace(0,2*pi,100);
y = zeros(size(x));
for i = 1:numel(x)
    y(i) = sin(x(i));
    set(ph,'XData',x(1:i));
    set(ph,'YData',y(1:i));
    drawnow;
end
为什么会这样。。。 使用
绘图(x(i),y)
可以绘制100个单点(每次迭代一个),默认情况下不会显示这些点。因此,情节看起来是空的


解决方案1:矢量化计算和直接绘图 我想你是想画一条连续的线。在这种情况下,不需要for循环,因为您可以在MATLAB中直接计算和绘制向量。因此,以下代码可能会满足您的需要:

x = linspace(0,2*pi,100);
y = sin(x);
plot(x,y);
请注意,
y
x
都是一个向量,
y(n)
等于
sin(x(n))
表示所有
n
。如果要绘制点本身,请在调用
plot
时使用-syntax,如下所示1:

1) 也可以使用其他类型的点,请参见上述链接文档


解决方案2:计算for循环中的值,然后进行绘图 如果要计算for循环中的值并随后进行打印:预分配所需变量(在本例中为
y
),计算for循环中的值,最后在计算后使用一个命令进行打印

x = linspace(0,2*pi,100);

y = zeros(size(x));
for i = 1:numel(x)
    y(i) = sin(x(i));
end

plot(x,y);

解决方案3:计算时动态更新绘图 如果您坚持在每次迭代中进行绘图,那么解决方案2中以前的代码可以按如下方式展开:创建一个地物,向其添加一个“空”绘图,并存储其句柄。在for循环中,计算值并将其添加到
y
-向量,如上所示。最后一步,您可以通过更改其
XData
YData
属性并调用
drawnow
来更新绘图。请注意,在for循环中每次调用
plot
都会带来不必要的开销,我不建议这样做

% create figure and plot
figure;
ph = plot(0,0);
ax = gca;
set(ax,'XLim',[0,2*pi]);
set(ax,'YLim',[-1,1]);

% calculate and update plot
x = linspace(0,2*pi,100);
y = zeros(size(x));
for i = 1:numel(x)
    y(i) = sin(x(i));
    set(ph,'XData',x(1:i));
    set(ph,'YData',y(1:i));
    drawnow;
end
简单方法 如果要在添加数据时绘制曲线,请尝试以下操作:

x = linspace(0,2 * pi, 100);
y = zeros(size(x));
for i=1:numel(x)
     y(i) = sin(x(i));
     plot(x(1:i), y(1:i), 'color', 'r')
     drawnow();
end
请注意,绘图会自动尝试设置x和y限制(曲线将缩放到绘图窗口),以防止您必须使用
xlim
ylim
手动设置x和y限制

正如Matt在回答中所说,在每次迭代中调用
plot
非常昂贵(即耗时)。因此,我建议使用数据源:

使用数据源更新图形 调用
drawnow
在每次迭代中都不是必需的,它只用于更新视觉效果,因此您可以直接看到更改。

简单方法 如果要在添加数据时绘制曲线,请尝试以下操作:

x = linspace(0,2 * pi, 100);
y = zeros(size(x));
for i=1:numel(x)
     y(i) = sin(x(i));
     plot(x(1:i), y(1:i), 'color', 'r')
     drawnow();
end
请注意,绘图会自动尝试设置x和y限制(曲线将缩放到绘图窗口),以防止您必须使用
xlim
ylim
手动设置x和y限制

正如Matt在回答中所说,在每次迭代中调用
plot
非常昂贵(即耗时)。因此,我建议使用数据源:

使用数据源更新图形
调用
drawnow
在每次迭代中都不是必需的,它只用于更新视觉效果,因此您可以直接看到更改。

我真的很感兴趣:您是从哪里想到这是解决问题的方法的?它是在什么课堂上教的吗?你在网上读过吗?你只是浏览了文档并尝试了一些东西吗?嗯,我目前正在MatConvNet上做一些工作,并要求绘制错误图,该图是在
for
循环中计算的,比如说2000次迭代。这就是为什么我要尝试上面的代码,因为当我试图绘制错误图时,它是空的。好吧,在循环内绘制通常是一个坏主意(就性能而言),所以尝试避免它,除非绝对没有其他方法。更好的方法是首先计算想要绘制的内容,然后只调用
plot
。如果您知道将要进行多少次迭代,那么分配一个大小为
numDataPoints*numIterations
的矩阵,然后只存储错误向量以备将来使用(这是除非您只希望存储一个值,例如SSE或RMSE,在这种情况下,大小为numIterations的向量就可以了)。祝你好运我真的很感兴趣