for文について

9 views (last 30 days)
for文において下記のように書くと
for c=1:4
end
1~4までループさせる事が出来ると思います。
ですが、私は下記に書くように
for c=1:4 r=:1:4:40
end
cとrの二つのループを同じタイミングで進ませたいのですが何か方法はありますでしょうか?

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 30 Sep 2021
Edited: Atsushi Ueno on 30 Sep 2021
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 Comments
Atsushi Ueno
Atsushi Ueno on 1 Oct 2021
@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はもう最初からこの辺を「しれっと」難しい事を意識せずに使わせてしまっているのです。
この事実に( ゚д゚)ハッ!と気付いて、その後はもう興奮して夜しか眠れませんでした。

Sign in to comment.

More Answers (1)

Hernia Baby
Hernia Baby on 30 Sep 2021
操作内容によりますが基本的には難しいです。
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 Comment
朋貴 熊田
朋貴 熊田 on 30 Sep 2021
ご回答ありがとうございます。

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!