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];

ここで、これら 3 つの線を 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)

私の質問は: 事前定義された数のプロットなしでこの関数を呼び出す方法はありますか? この場合、3 つの線をプロットしましたが、何本の線をプロットしたいのか事前にわからない場合、この構文はまだ可能ですか?

Hold Allもちろん、Forループを使用してこれを実行できることは承知しています。ただし、必要に応じてループを回避したいので、これを尋ねます。これに対するエレガントな解決策はありますか?それとも、ループを使用することに頼るべきですか?

編集:確かにインデックスにタイプミスがありました。s(1).Xval の代わりに s.Xval(1)

4

3 に答える 3

3

プロット関数でそれを行うことができます。ドキュメントには、次のことが記載されています。

Xn または Yn が行列の場合、それらは 2 次元で同じサイズでなければならず、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

私は実際に、かなりいいと思う別の方法を見つけました。

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 に答える
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];

% すべてのデータを 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 に答える