一次绘制可变数量的向量?

时间:2012-12-04 16:28:52

标签: matlab for-loop struct plot

我在想:

假设我有一个结构:

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 AllFor循环来完成此操作。但是,我问这个是因为如果需要,我想避免循环。有一个优雅的解决方案吗?或者我应该只使用循环?

编辑:索引确实存在拼写错误。 s.Xval(1)而不是s(1).Xval

3 个答案:

答案 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')

会给你

enter image description here

答案 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{:});

此代码简单易读,并且不需要循环。