5. プログラミング

5.1. プログラミングの基本

これまでの処理では、単にコマンドや関数をコマンドウィンドウに直接入力して実行しました。 しかし、この方法では複数の処理をまとめて実行したいときや処理を行いたいときは不便です。 このような場合、M-ファイルと呼ばれるMATLABプログラムを作成します。 M-ファイルとは、コマンドや関数を実行したい順に記述したテキストファイル(拡張子:.m)です。 テキストエディタを使って、M-ファイルを作成すれば、他のMATLAB関数やコマンドと同じように利用することができます。 なお、MATLAB言語はインタプリタ型言語なので、M-ファイルの実行時にコンパイルやリンクという前処理は必要ありません。

5.1.1. プログラミングの基本的な流れ

  1. テキストエディタを使ってM-ファイルを作成
  2. コマンドウィンドウ、もしくは他のM-ファイルから作成したM-ファイルを実行

M-ファイルには下記の2種類の形式が存在します。

  • スクリプトM-ファイル
  • ファンクションM-ファイル

M-ファイルはテキストファイルなので、任意のテキストエディタを使用して編集することができます。 MATLABにはM-ファイルの編集に便利なエディタがありますので、これを使用することを推奨します。

5.1.2. M-ファイル編集エディタの起動方法

  • 「edit」コマンドを入力する

以下のコマンドを実行する

    >> edit
  • 「File」メニューから選択する

「File」⇒「New」⇒「M-ファイル」を選択

5.2. スクリプトM-ファイル

スクリプトM-ファイルは以下のような機能をもっています。

  • 一連のコマンド・関数を連続的に処理することができる

スクリプトM-ファイルには特別な構文は必要ありません。 単純にテキストファイルの先頭行から順に処理内容を記述します。 実行は、次の(1)~(4)で行います。

(1) エディタの起動

前節で述べたように起動します。

  • 「edit」コマンドを入力する
  • 「File」メニューから選択する

(2) スクリプトM-ファイルの作成

プログラムは以下のように記述します。 ここでは、例として、次の関数のグラフを作成する 処理プログラム「sample1.m」ファイルを作成します。

Y=0.1-0.3cos(x)+0.2cos(2x)
【sample1.m】

clear all
a=[0.1 -0.3 0.2];
x=-5:0.1:5;
y=a(1)+a(2)*cos(x)+a(3)*cos(2*x);
plot(x,y)

(3) スクリプトM-ファイルの保存

エディタの「File」メニューから「Save As」を選択し、「sample1.m」として保存します。
なお、ファイル名の保存には以下の制限があります。

1:大文字・小文字は区別されます
2:ファイル名の文字制限は63文字です
3:数字及び演算子で始まるファイル名は使用できません
4:日本語文字列をファイル名に使用することはできません
5:関数・コマンド名と同じ名前にしないでください
6:予約変数と同じ名前にしないでください

(4) スクリプトM-ファイルの実行

スクリプトM-ファイルの実行はコマンドラインにファイル名を

>> sample1

と入力するか、エディタの「Run」ボタンを押す。 以下のグラフが表示されれば、成功です。

  • コメントアウト

上記で作成したスクリプトM-ファイルにコメントを加えるには、 まず「%」を記述し、それ以降にコメント文を記述します。
「%」以降はコメントとみなし、MATLABは行の内容を無視し、実行しません。 ちなみに上記ファイルにコメント文を追記すると以下のようになります。

【sample1.m】

% ワークスペース内の全ての変数を消去する
clear all
% 係数aを定義する
a=[0.1 -0.3 0.2];
% -5から5において、0.1間隔でxを設定する
x=-5:0.1:5;
% y=a(1)+a(2)cos(x)+a(3)cos(2x)の計算
y=a(1)+a(2)*cos(x)+a(3)*cos(2*x);
% 結果をプロットする
plot(x,y)

5.3. ファンクションM-ファイル

ファンクションM-ファイルは以下のような機能をもっています。

  • 入力値を受け入れ、出力値を返すユーザ定義の関数を作成することができる

(1) MATLAB関数

MATLABにおける関数は、数学における関数概念と同様に、入力と出力間の対応関係をして定義されています。 例えば、MATLABのsin関数について考えます。 y=sin(x)という式は、 xという変数を関数の入力値にとり、その値の正弦値を計算した結果を変数yに代入しています。 関数の入力値に用いる変数(この場合x)のことを入力変数、 関数の計算結果の出力先の変数(この場合y)のことを出力変数といいます。 MATLABではデフォルトで多くの関数が提供されていますが、 これに加えてユーザ定義の関数をプログラミングして使用することができます。 この関数機能をプログラミングしたM-ファイルのことをファンクションM-ファイルといいます。

(2) ファンクションM-ファイル構文

スクリプトM-ファイルには特別な構文は必要なく、 ファイル名もMATLABの変数名の規則を満たすものであれば、 自由な名前をつけることができました。 これに対して、ファンクションM-ファイルには次の2点の条件があります。

1.M-ファイルの1行目にfunction行を記述する(必須)

function [出力変数] = 関数名(入力変数)

2.関数名とM-ファイル名を同じにする(推奨)

関数名: sample_func ⇒ M-ファイル名:sample_func.m

また、MATLABでは、複数入力・複数出力の関数を作成することができます。 複数の場合は以下のように記述します。

function [y1,y2,y3,…] = sample(x1,x2,x3,…)

出力引数が1つの場合は、出力引数を大括弧[]で囲む必要はありません。

(3)ファンクションM-ファイルの作成と実行

例として、前節と同様に次の関数のグラフを作成する処理プログラムファイルを作成します。 今回は、スクリプトM-ファイルからファンクションM-ファイルを呼び出すような処理にします。

Y=0.1-0.3cos(x)+0.2cos(2x)
【sample2.m】

clear all
a=[0.1 -0.3 0.2];
x=-5:0.1:5;
y=func2(a,x);

【func2.m】

function y=func(a,x)
y=a(1)+a(2)*cos(x)+a(3)*cos(2*x);
plot(x,y)

実行方法は、sample2.mファイルとfunc2.mファイルを作成後、コマンド「sample2」を入力するか、 M-ファイルエディタでsample2.mファイルを開き、「Run」ボタンを押すかのどちらかです。 実行結果は前節と同様になります。

5.4. 制御構造

M-ファイルは原則として1行目から順に処理を実行すると前節まで述べました。 しかし、この処理を条件などにより変更できれば、より高度な処理を実現できます。 MATLABには、このようなプログラムを制御するための構文が用意されています。 ここでは、代表的な比較演算子、論理演算子、制御構文について説明します。

(1)比較演算子

比較演算子について、下表に示します。

==    eq 等しい
~=    ne 等しくない
<    lt 小さい
>    gt 大きい
<=    le 小さいか等しい
>=    ge 大きいか等しい

比較演算子は、後述する制御構文ifに付属する形で頻繁に用いられる。 比較演算子は2つの変数を比較し、その比較が正しい場合は1、そうでない場合は0を出力する。 例えば、a==bはaとbが等しいときに1を、そうでない場合には0を出力する。

>> a=4; b=4; c=(a==b)

c =

     1

(2)論理演算子

論理演算子について、下表に示します。

&    and 要素ごとの論理積
|    or 要素ごとの論理和
~    not 論理否定
xor 排他的論理和

(3)制御構文

制御構文には下表に示すものがあります。

if 条件分岐による処理選択
switch 多分岐選択処理
for 指定回数の繰り返し処理
while 不定回数の繰り返し処理
try/catch 例外処理(エラー処理)

それぞれの詳細について、説明します。

  • if文

MATLABにおけるif文の構成は次のようになります。

if 条件1
  プログラムA
elseif 条件2
  プログラムB
else
  プログラムC
end

(例) if文サンプルプログラム

a=1;
if a<0
  b=1;
elseif a==0
  b=2;
elseif a<=2
  b=3;
else
  b=4;
end

このプログラムを実行するとbに3が代入される。 aが0以下のときはb=1、0のときはb=2、0より大きく 2以下のときはb=3、2より大きいときはb=4が代入される。

  • switch文

switch文もif文と同様に条件分岐を実行するコマンドであり、構造は次のようになります。

switch a
  case m
    プログラムA
  case n
    プログラムB
  otherwise
    プログラムC
end

switchの直後には変数、または計算式が続きます。 上の例では変数aを指定している。 このaがcaseの直後に続く文と一致するとき、その後のプログラムを実行する。 上記例ではa==mのとき、プログラムAが実行され、a==nのとき、プログラムBが実行される。 どちらにも当てはまらない場合、otherwiseの後ろの文、つまりプログラムCが実行される。

(例) switch文サンプルプログラム

a=3;
 switch a
   case 1
     b=1;
   case 2
     b=2;
   case 3
     b=3;
   otherwise
     b=4;
 end

この場合は、aの値が3つ目のcase文に合致するのでbに3が代入される。

  • for文

MATLABにおけるfor文はforとendに囲まれる部分を繰り返し実行する。

for [変数] = [ベクトル]
  % この部分が繰り返し実行される
end

(例) for文サンプルプログラム1(繰り返し回数 50回)

for n=1:50;

end

上記例では、n=1,2,3,…,50と変化しながらfor~end間のプログラムを実行します。
(例) for文サンプルプログラム2(繰り返し回数 11回)

for n=0:0.1:1;

end

上記例では、n=0,0.1,0.2,0.3,…,1と変化しながらfor~end間のプログラムを実行します。
(例) for文サンプルプログラム3(繰り返し回数 4回)

for n=[1 3 -1 4]

end

上記例では、n=1,3,-1,4と変化しながらfor~end間のプログラムを実行します。

  • breakとcontinue

for文の繰り返し途中で計算を中止し、for文の外に抜け出すときはbreak文を用います。

(例) break文サンプルプログラム

a=0;
for n=1:100
  a=a+n;
  if a>100
    break
  end
end

上記例では、3行目でaにnが加算され、それが100より大きくなるとfor文を中断し、 次(8行目以降)へと進む。 for文の繰り返し中に、以降の計算をスキップし、 次の繰り返し計算に移るときはcontinue文を用います。

(例) continue文サンプルプログラム

a=0;
for n=1:100
  if rem(n,3)==0
    continue
  end
  a=a+n;
end

ここで用いているrem(a,b)はaをbで割った余りを出力します。 このプログラムはnが3のときは何もせず、次の繰り返しに進み、3の倍数でないときのみa=a+nを実行します。

  • while文

for文では、繰り返し回数が明示されているのに対し、 while文はwhileの後ろに続く条件文を満たす間、繰り返し実行する。

while n<m
  % n<mが真である間、この部分が繰り返し実行される
end

上記例では、n<mが真(つまり1)の間はwhile内を繰り返し実行し、 繰り返す回数はそのwhile内のプログラムに依存します。
(例) while文サンプルプログラム1

n=1;
while n<=5
  disp('ここは5回実行される')
  n=n+1;
end

変数nを1から5まで変化させながら5回繰り返す。
(例) while文サンプルプログラム2

n=1;
while 1
  disp('ここは5回実行される')
  if n>=5
    break;
  end
  disp('ここは4回実行される')
  n=n+1;
end

whileの後ろの条件式を1に設定し(つまり、ここの条件は常に真なので、ここでwhile文が終わることはない)、 while内にあるif文で条件を満たしたときにbreak文でwhileから抜け出し繰り返しを中断する。