中心座標(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 Exchange에서 Word games에 대해 자세히 알아보기

제품

질문:

2017년 2월 7일

댓글:

2017년 2월 8일

Community Treasure Hunt

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

Start Hunting!

Translated by