中心座標(x, y) と半径r の列 X, Y, R をそれぞれ同じサイズで保存しているとき,それぞれの円をプロットするスクリプトをfor 文を使わずに実装したいです. どのようにすれば良いのでしょうか? ちなみに,for 文を使って所望の動作を実現するには以下のようなスクリプトになります.
figure
hold on
axis equal
t = linspace(0,2*pi,100);
X = [1; 2; 4];
Y = [3; 2; 1];
R = [1; 2; 0.5];
for i = 1:numel(X)
plot(R(i)*sin(t)+X(i),R(i)*cos(t)+Y(i))
end
難しさとしてはt のサイズが X, Y, R と異なること(サイズが同じであっても所望の動作はできません), さらに,kron で無理やり点の集合を作るとすべての点が繋がった状態で表示されてしまうなどの問題を抱えております. 目的としては X, Y, R がある程度大規模なものを作成する予定です. どうぞよろしくお願いいたします.

 采纳的回答

mizuki
mizuki 2017-2-7

4 个投票

for の部分を次の1行で置き換える方法ではいかがでしょうか。(for で描いたときと xlim, ylim が少し変わります)
plot( (R*sin(t)+X)', (R*cos(t)+Y)' )

5 个评论

迅速なご対応ありがとうございます.最初は不思議でしたが,各要素ごとの計算結果を見比べて,plot のドキュメンテーションに「X と Y が共に行列の場合、...関数 plot は X の列に対して Y の列をプロットします。」との記述を見つけ,動作の理解が出来ました.この度はありがとうございました.
mizuki
mizuki 2017-2-7
問題が解決したとのことで安心しました!
類似の問題を検索してこのページに来られる方が解決/未解決を判断するために、回答に問題がなく終了する場合は accept をしていただけると助かります。どうぞよろしくお願いします。
ご指摘ありがとうございます.あともう一点だけ確認したいことができました.Windows, Linux では上記の通りで成功したのですが,Mac Yosemite のMATLAB R2016a での実行では
エラー: +
行列の次元は一致しなければなりません。
と出ます.ひとまず,
plot( (R*sin(t)+X*ones(size(t)))', (R*cos(t)+Y*ones(size(t)))' )
としましたが,代案があればご指導いただけないでしょうか?質問の要点がズレてきて申し訳ありませんが,よろしくお願いいたします.
それは OS の問題ではなく、mizuki さんが提案したコマンドが R2016b の新機能を使っているからです。
R2016a 以前でしたら、使われている代案でやるのをお勧めします。
因みにもう少し効率よい構文がこちらです。(R2016a 以前)
plot( bsxfun(@plus,R*sin(t),X)', bsxfun(@plus,R*cos(t),Y)' )
ご回答ありがとうございます.おかげさまでキレイに書くことができました.

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Word games 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by