2

我在想:

假设我有一个结构:

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

4

3 回答 3

3

您可以使用绘图功能来做到这一点。文档提到:

如果 Xn 或 Yn 是矩阵,它们必须是二维的且大小相同,并且 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')

会给你

在此处输入图像描述

于 2012-12-04T16:38:26.830 回答
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{:});
于 2012-12-04T16:57:14.653 回答
1

我实际上找到了另一种在我看来相当不错的方法。

plotdata = cell(length(s)*2,1);
plotdata(1:2:end) = {s.Xval};
plotdata(2:2:end) = {s.Yval};
plot(axes,plotdata{:});

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

于 2012-12-07T12:44:44.500 回答