中心座標(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 件のコメント

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

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeWord games についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by