필터 지우기
필터 지우기

for文について

조회 수: 25 (최근 30일)
朋貴 熊田
朋貴 熊田 2021년 9월 30일
댓글: Atsushi Ueno 2021년 10월 1일
for文において下記のように書くと
for c=1:4
end
1~4までループさせる事が出来ると思います。
ですが、私は下記に書くように
for c=1:4 r=:1:4:40
end
cとrの二つのループを同じタイミングで進ませたいのですが何か方法はありますでしょうか?

채택된 답변

Atsushi Ueno
Atsushi Ueno 2021년 9월 30일
편집: Atsushi Ueno 2021년 9월 30일
C言語でいうところの下記のようなイメージだと想定します。
for(c=1,r=1; c <= 4; c++,r+=4)
; // % c=1,2,3,4 r=1,5,9,13 (40まではいかない)
@Janさんの回答の真ん中辺りで、MATLABのindexing仕様の良さに気付かされます。
cとrの二つのイテレータを一つの変数"iterator"にまとめてしまえば良いのです。
下記の様に書くと、iteratorはループを回る度に与えられた行列の各列を走査していきます。
C++等比較的新しい言語に範囲for文がありますが、MATLABにもこれと同じ仕様が最初からあるのです。
for iterator = [1:1:4; 1:4:13]
c = iterator(1) % c=1,2,3,4
r = iterator(2) % r=1,5,9,13
end
c = 1
r = 1
c = 2
r = 5
c = 3
r = 9
c = 4
r = 13
  댓글 수: 3
朋貴 熊田
朋貴 熊田 2021년 9월 30일
ご回答ありがとうございます。早速試してみます。
Atsushi Ueno
Atsushi Ueno 2021년 10월 1일
@Hernia Baby さん > 同感です。for文のドキュメンテーションは滅多に読まないので、私も
for index = values
statements
end
の応用例をみて「なんとこんな書き方も出来るのか!」とカルチャーショックを受けました。
for index = 1:100
statements
end
しかしですよ、MATLABで最初に習得するこの構文は「文法」だと認識していましたが、良く考えると(1:100)はベクトルで、上と下の文法は同じであると言えます。valuesは(1:100)でも[1:100;1:200]でも書き方は同じですし、それだけで動いてしまいます。一方C++等のfor文と範囲for文は文法が異なり、扱う変数の次元が一つ増えると大変な事になり、やれオーバーロードだなんだの面倒な知識習得を余儀なくされます。MATLABはもう最初からこの辺を「しれっと」難しい事を意識せずに使わせてしまっているのです。
この事実に( ゚д゚)ハッ!と気付いて、その後はもう興奮して夜しか眠れませんでした。

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Hernia Baby
Hernia Baby 2021년 9월 30일
操作内容によりますが基本的には難しいです。
c と r を同時に処理する場合、c = 1のときでも r は10この処理をそれぞれ行う必要があります。
なので以下のようにforの中にforで囲うのが一般的です
for c = 1:4
for r = 1:4:40
COMMAND;
end
end
----------------------------
ものによって同時に何かをする場合は cellfunarrayfun などを使うといいかもしれません
X = {5:5:100, 10:10:100, 20:20:100};
Y = {rand(1,20), rand(1,10), rand(1,5)};
figure
hold on
p = cellfun(@plot,X,Y);
  댓글 수: 1
朋貴 熊田
朋貴 熊田 2021년 9월 30일
ご回答ありがとうございます。

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 MATLAB 入門에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!