为什么会发生这种情况...
使用plot(x(i),y)
,您正在绘制100个单独的点(每次迭代一个),默认情况下它们不会显示。因此,绘图看起来是空的。
解决方案1:向量化计算和直接绘图
我假设您想要绘制连续的线条。在这种情况下,不需要for循环,因为您可以直接在MATLAB中计算和绘制向量。因此,以下代码可能实现您的需求:
x = linspace(0,2*pi,100);
y = sin(x);
plot(x,y);
请注意,
y
和
x
一样是向量,并且对于所有的
n
,
y(n)
等于
sin(x(n))
。如果您想要绘制点本身,请在调用
plot
时使用
LineSpec语法,像这样
1:
plot(x,y,'*');
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
是不必要的昂贵操作,我不建议这样做。
figure;
ph = plot(0,0);
ax = gca;
set(ax,'XLim',[0,2*pi]);
set(ax,'YLim',[-1,1]);
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
plot
一次。如果您知道将要进行多少次迭代,那么应该很容易分配一个大小为numDataPoints * numIterations
的矩阵,然后仅为以后存储您的误差向量(除非您更喜欢仅存储一个值,例如 SSE 或 RMSE,在这种情况下,大小为 numIterations 的向量就足够了)。祝你好运! - Dev-iL