我在想:
假设我有一个结构:
s(1).Xval=[1 2 3];
s(2).Xval=[1 2 3 4];
s(3).Xval=[1 2 3];
s(1).Yval=[1 2 3];
s(2).Yval=[4 3 2 1];
s(3).Yval=[3 2 1];
现在我想在一个图中绘制这三行。我可以通过以下方式做到这一点:
plot(s(1).Xval,s(1).Yval,s(2).Xval,s(2).Yval,s(3).Xval,s(3).Yval);
这是可能的,因为MATLAB通过以下语法提供了绘图函数的可变数量输入参数的机会:
plot(X1,Y1,...,Xn,Yn)
我的问题是:有没有办法在没有预定数量的情节的情况下调用此函数?所以在这种情况下,我绘制了三条线,但如果我不知道我想要绘制多少行,这种语法仍然可以吗?
我当然知道我可以使用Hold All
和For
循环来完成此操作。但是,我问这个是因为如果需要,我想避免循环。有一个优雅的解决方案吗?或者我应该只使用循环?
编辑:索引确实存在拼写错误。 s.Xval(1)而不是s(1).Xval
答案 0 :(得分:3)
您可以使用plot功能执行此操作。文档提到:
如果Xn或Yn是矩阵,则它们必须是2-D且大小相同,并且Yn列相对于Xn列绘制。 plot会按ColorOrder和当前轴的LineStyleOrder属性指定的顺序自动选择颜色和线条样式。
要制作X和Y矩阵,您需要用NaN填充它们。像这样:
X = [1 2 3 NaN
1 2 3 4
1 2 3 NaN]
Y = [1 2 3 NaN
4 3 2 1
3 2 1 NaN]
由于绘图函数将列与列对比,并且您想要行反对行,您需要转置它们。
plot(X',Y','Marker','x')
会给你
答案 1 :(得分:1)
我认为你有一个拼写错误,所以正确的结构是这样的:
s(1).Xval=[1 2 3];
s(2).Xval=[1 2 3 4];
s(3).Xval=[1 2 3];
s(1).Yval=[1 2 3];
s(2).Yval=[4 3 2 1];
s(3).Yval=[3 2 1];
%将所有数据收集到一个单元格中
c = {};
for k = 1 : length(s)
c = cat(2, c, {s(k).Xval}, {s(k).Yval});
end
%并绘图:
plot(c{:});
请注意,c{:}
不是单个变量,而是c
更新:没有循环,但丑陋
c = reshape(reshape({s.Xval, s.Yval}, length(s), [])', [], 1);
plot(c{:});
答案 2 :(得分:1)
我实际上发现了另一种在我看来相当不错的方法。
plotdata = cell(length(s)*2,1);
plotdata(1:2:end) = {s.Xval};
plotdata(2:2:end) = {s.Yval};
plot(axes,plotdata{:});
此代码简单易读,并且不需要循环。