for文について

26 visualizzazioni (ultimi 30 giorni)
朋貴 熊田
朋貴 熊田 il 30 Set 2021
Commentato: Atsushi Ueno il 1 Ott 2021
for文において下記のように書くと
for c=1:4
end
1~4までループさせる事が出来ると思います。
ですが、私は下記に書くように
for c=1:4 r=:1:4:40
end
cとrの二つのループを同じタイミングで進ませたいのですが何か方法はありますでしょうか?

Risposta accettata

Atsushi Ueno
Atsushi Ueno il 30 Set 2021
Modificato: Atsushi Ueno il 30 Set 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 Commenti
朋貴 熊田
朋貴 熊田 il 30 Set 2021
ご回答ありがとうございます。早速試してみます。
Atsushi Ueno
Atsushi Ueno il 1 Ott 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はもう最初からこの辺を「しれっと」難しい事を意識せずに使わせてしまっているのです。
この事実に( ゚д゚)ハッ!と気付いて、その後はもう興奮して夜しか眠れませんでした。

Accedi per commentare.

Più risposte (1)

Hernia Baby
Hernia Baby il 30 Set 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 Commento
朋貴 熊田
朋貴 熊田 il 30 Set 2021
ご回答ありがとうございます。

Accedi per commentare.

Categorie

Scopri di più su MATLAB 入門 in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!