連載
» 2014年06月20日 11時50分 UPDATE

無償ソフトで技術計算しよう【プログラミング基礎編】(3):FreeMatで使われるプログラム書式の基本を押さえよう (1/2)

今回は、FreeMatでプログラムを記載する書式「mファイル」についての解説。数値を渡されて処理結果を返すタイプのプログラム「関数mファイル」や、数式を登録する働きを持つ「無名関数」についても説明する。

[伊藤孝宏,MONOist]

 前回は「for」コマンド、「while」コマンドについて説明しました。今回は、プログラムを記載する書式「mファイル」について説明します。また、数値を渡されて処理結果を返すタイプのプログラム「関数mファイル」や、数式を登録する働きを持つ「無名関数」についても説明します。

筆者注:FreeMatはコマンド入力後にエンターキーを押すとコマンドを実行します。本連載ではエンターキーの記述を省略しますが、操作の際にはコマンド入力後にエンターキーが必要です。



スクリプトmファイル

 コマンドウィンドウに記述されたコマンドは↑カーソルキーで再度呼び出すことはできますが、たくさんあると面倒です。従って、後で利用したり、修正したりといった場合、コマンドを保存しておく必要があります。FreeMatでは、コマンドウィンドウの代わりにエディタ上にコマンドを記載し、拡張子mを付けて保存します。

 例として、コマンドウィンドウに下記のようなコマンドを順に入力すると、図1に示す円が得られます。

-->clear;
-->xy=zeros(2,360);
-->for k=1:360
xy(1,k)=cosd(k);xy(2,k)=sind(k);
end
-->plot(xy(1,:),xy(2,:));
-->axis('square');
yk_FreeMat_pro03_01.jpg 図1 実行結果

 forコマンドを入力すると、コマンドウィンドウのプロンプト(入力を促すカーソル)は、「-->■」の点滅から、「■」の点滅に変わります。これは、「end」を入力するまで続きます。

 同じ内容をエディタに記載したものが、下記のスクリプトmファイルであるex309.mです。

clear;
xy=zeros(2,360);
for k=1:360
    xy(1,k)=cosd(k);
    xy(2,k)=sind(k);
end
plot(xy(1,:),xy(2,:));
axis('square');
ex309.m

>>「ex309.m」ダウンロード

 「clear」で全ての変数を初期化しています。FreeMatでは変数定義をしないので、前の処理で同じ名前の変数が残っているとその値を使ってしまいます。従って、スクリプトの最初でclearとして全ての変数を初期化しておくと安全です。xy=zeros(2,360);で2行360列の0要素の配列を用意しています。

 forループでは、1行目にk度でのcos値を、2行目にsin値を格納しています(cosd、sindは角度が度単位でのcosとsinを返す関数)。xy(1,k)はxy配列の1行k列目の要素、xy(1,:)はxy配列の1行目の全ての要素という意味です。

 FreeMatでは、コマンドウィンドウとエディタ間でコマンドや変数が共通しているため、例えば、clearからendまでを作成、実行してから、コマンドウィンドウでplot(xy(1,:),xy(2,:));として、結果を確認するといったことも可能です。

 プログラム作成では、フローチャートを作成し、処理の流れを明確にしてから、コーディングするというのは常識ですが、エンジニアリングでは、やってみなければ分からないというものも多く、そういった場合、「プログラムを作っては試して……」という作業になります。FreeMatにおけるプログラミングは、心臓部のプログラムをエディタで作成して、実行結果をコマンドウィンドウで確認して、プログラムの修正や表示部分の追加、といった試行錯誤でプログラムを作成するような方法に適しています。

関数mファイル

 関数mファイルは入力引数を受け取り、処理結果を出力引数として返すプログラムです。先頭行が、「function 出力引数=関数名(入力引数)」という形になります。また、保存するファイル名は関数名.mとなります。

 例として、ex309と同じ処理を、入力引数としてn度まで計算し、処理結果のxyを出力引数として返す関数mファイルを作成してみます。

function xy=ex310(n)
    xy=zeros(2,n);
    for k=1:n
        xy(1,k)=cosd(k);
        xy(2,k)=sind(k);
    end
ex310.m

>>「ex310.m」ダウンロード

 ex310.mを保存し、コマンドウィンドウで、yz=ex310(360);と入力すると、ex310.mが実行され、変数yzに計算結果が入ります。コマンドウィンドウでplot(yz(1,:),yz(2,:));axis('square');と入力すると、図1と同じ結果が得られます。

 ここで、コマンドウィンドウ横の「Variables」を見ると、変数nやkおよびxyは表示されません。これは、関数mファイル内の変数はローカル変数で、コマンドウィンドウの変数とは共通していないためです。関数mファイルとの値のやりとりは入力変数と出力変数とを介して行われます。

 関数mファイルは内部に複数の「function」を定義することが可能です。例えば、ex310.mにプロットする部分を付け加えてみます。コマンドウィンドウでex311(360);と入力すると、プロットまで行われ、図1の結果が得られます。なお、FreeMatは配列で処理できるので、ex311.mのように関数内に変数を配列として与えることで、forループは不要となります。ループ処理をできるだけ使わないようにプログラムを作成することが、計算効率を向上させることになります。

function xy=ex311(n)
    xy=[cosd(1:n);sind(1:n)];
    xyplot(xy);
function xyplot(xy)
    plot(xy(1,:),xy(2,:));
    axis('square');
ex311.m

>>「ex311.m」ダウンロード

 xyplot(xy)という名前でプロットするコマンドを記述しておき、ex311の最後で、xyplotを呼び出しています。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.