6回目のMATLAB記事です。
今回は「for文」をメインに4回目の補完となる内容です。
for文を使ったプログラム例をこの回で出していたので、ここできちんと説明したいと思います。
for文
例えば、ある動作を100回繰り返したい時、for文で以下のように書くことができます。
for i=1:100
% 繰り返したい動作
end
また、for文の中にfor文を入れる事も可能です。
MATLABのfor文の書き方は他のプログラミング言語と大差ありませんが、一つだけ注意しなければならないことがあります。それはループの開始番号です。
for文においては大体、文中で配列を使うと思います。その時、ループ用の変数(上の例では i)で配列の要素を指定しますよね。
C言語だと配列の一番最初の要素番号は0です。C言語に限らずほぼ全てのプログラミング言語において0でしょう。
一方でMATLABの場合、配列の一番最初の要素の番号は「1」なのです。
ここまでくればもうお分かりですね。そんな理由でループの開始番号には注意が必要なのです。
もしループを0から開始して、ある配列 A の最初の要素を A(0) と指定すればエラーが発生します。
for文を使った複数個のグラフの一括描画
それでは、for文を使って複数個の2次元グラフを一枚の図に重ねて描画してみましょう。
今回は $y=\text{sin}(kx)\ (k=1,2,3)$ を $0 \leq x \leq 2\pi$ の範囲で描いてみます。
x = 0:pi/100:2*pi; % 0から2*piの範囲, 刻み幅 pi/100
% グラフの描画
for k=1:3
y = sin(k*x);
plot(x, y, 'LineWidth', 2, 'DisplayName', ['k=',num2str(k)])
hold on
end
title('sin(kx)')
xlabel('x')
ylabel('y')
legend
xlim([x(1), x(end)]) % x(end):配列 x の最後の要素
ylim([-1.5, 1.5])
grid
set(gca, 'FontSize', 13)
いつも通り $x$ の範囲を $\pi/100$ 刻みにした配列 x を用意します。
そしてfor文を使い、3つのグラフを一気に描画してしまいます。ここではループ用の変数 k を式中の $k$ に一致させて実行します。変数 y はループの度に上書きされるので結果的に三種類のグラフを描けるのです。
MATLABでは k=1:3 のように刻み幅を具体的に指定しない場合、その値はデフォルトで1になります。したがって k はループ中に 1,2,3 と変化します。
4回目でも説明した通り、for文、DisplayName、num2str() を組み合わせればループ用の変数を凡例に使うことができ、エレガント?に凡例を作ることができます。
x(1) は配列のいちばん最初の要素です、ここでは0です。開始番号の説明をしたので意識的に使ってます。
x(end)は配列 x の最後の要素という意味です。ここでは $2\pi$ のことです。MATLAB では要素番号をendとすることで最後の要素を指定できます。これはよく使うのでぜひ覚えておいてください。
終わりに
ループ構造の中で、特に危険視されているものに「無限ループ」があります。
無限ループは誰でも簡単に作ることができます。while(true) を使うだけです。
無限ループは実行中のアプリケーションやマシンを強制終了しないと止まりません。また、これを放置すると処理のしすぎで実行中のマシンが壊れる可能性もあります。さらにはバグの原因にもなりますので、好まれる構造ではありません。
一方、本当に適切に扱えば小規模のプログラムを書く上で便利な道具になる場合があります(良い例は思いつきませんが...)。とはいえ、これは一種の裏技のようなもので積極的に使うべきものではありません。基本は必ず止まるループ構造を作るようにしましょう。
よろしければ次回の記事も読んでくださると大変嬉しいです。
※本記事に対する改善点や修正点、またはこんな事が知りたいといったご意見がありましたらぜひご連絡ください。