【Matlab】for文を使って指定回数の繰り返し処理の実現方法について理解する

みなさま、お疲れ様です。

自分が指定した回数で繰り返し処理をさせたい!

ということで困っている方にどうやったらいいか?なんで実現できるのか?を理解してみようと思います。

スポンサーリンク

指定回数の繰り返し処理をするサンプル関数

for文を使って再帰処理を行えば、実現できます。
その例を以下に示します。

function nestedForLoop(variable_index, num_variables, initial_values,...
                       increments, final_values, current_values)
    if variable_index > num_variables
        % すべての変数の組み合わせに対して何か処理を行う
        disp(current_values);
    else
        for i = initial_values(variable_index):...
                increments(variable_index):...
                final_values(variable_index)
            current_values(variable_index) = i;
            nestedForLoop(variable_index + 1, num_variables, initial_values,...
                          increments, final_values, current_values);
        end
    end
end

この関数を

nestedForLoop(1, 2, [1 1],[1 1], [2 2])

と実行すると

[1 1]
[1 2]
[2 1]
[2 2]

と表示されます。

なぜなんでしょうか。それを理解しようとする誰に需要があるのか分からない記事です。はい、解説始めますね。

コードの動作理解

例えば、先ほどと同じように

nestedForLoop(1, 2, [1 1],[1 1], [2 2])

と実行したとします。こうするとどうなるかを順番に書いていきます。

nestedForLoop(1,2,[1 1],[1 1], [2 2])のi=1のループ

elseに入り、index=1のfor文がi=1で実行されます。

1行目:currentvalues(1) = 1
2行目:nestedForLoop(2,2,[1 1],[1 1],[2 2])が実行されます。

nestedForLoop(2,2,[1 1],[1 1],[2 2])のi=1のループ

index=2で入れ子構造のfor文がi=1で実行されます。

1行目:currentvalues(2) = 1 つまりcurrentvaluesの中身は[1 1]
2行目:nestedForLoop(3,2,[1 1],[1 1],[2 2])が実行されます。

nestedForLoop(3,2,[1 1],[1 1],[2 2])が実行

if文に入ります。currentvaluesがdisplayされるだけなので、[1 1]が出力されます。これでこの関数は終わります。

nestedForLoop(2,2,[1 1],[1 1],[2 2])のi=2のループ

index=2で入れ子構造のfor文がi=2で実行されます。
1行目:currentvalues(2) =2 つまりcurrentvaluesの中身は[1 2]
2行目:nestedForLoop(3,2,[1 1],[1 1],[2 2])が実行されます。

nestedForLoop(3,2,[1 1],[1 1],[2 2])が実行

if文に入ります。currentvaluesがdisplayされるだけなので、[1 2]が出力されます。これでこの関数は終わります。

nestedForLoop(2,2,[1 1],[1 1],[2 2])の関数も終わります。

nestedForLoop(1,2,[1 1],[1 1], [2 2])のi=2のループ

elseに入り、index=1のfor文がi=2で実行されます。

1行目:currentvalues(1) = 2
2行目:nestedForLoop(2,2,[1 1],[1 1],[2 2])が実行されます。

nestedForLoop(2,2,[1 1],[1 1],[2 2])のi=1のループ

index=2で入れ子構造のfor文がi=1で実行されます。

1行目:currentvalues(2) = 1 つまりcurrentvaluesの中身は[2 1]
2行目:nestedForLoop(3,2,[1 1],[1 1],[2 2])が実行されます。

nestedForLoop(3,2,[1 1],[1 1],[2 2])が実行

if文に入ります。currentvaluesがdisplayされるだけなので、[2 1]が出力されます。これでこの関数は終わります。

nestedForLoop(2,2,[1 1],[1 1],[2 2])のi=2のループ

index=2で入れ子構造のfor文がi=2で実行されます。
1行目:currentvalues(2) =2 つまりcurrentvaluesの中身は[2 2]
2行目:nestedForLoop(3,2,[1 1],[1 1],[2 2])が実行されます。

nestedForLoop(3,2,[1 1],[1 1],[2 2])が実行

if文に入ります。currentvaluesがdisplayされるだけなので、[2 2]が出力されます。これでこの関数は終わります。

nestedForLoop(2,2,[1 1],[1 1],[2 2])の関数も終わります。

どう動くかのまとめ

for文を入れ子構造にして実行する関数にすることで、変数数と各初期値と増分と最終値を設定していたら、各変数の変化数のパターンだけループを回す。という動きを実現できます。

終わりです。最後までお読みいただきありがとうございました。誰かの参考になれば幸いです。