Octave
とある論文のsupplemental materialにあったMATLAB(線形代数のパッケージを詰め込んだ有料ソフト)のコードを動かしたかったので、Octave(MATLABと互換性のある無料ソフト)をインストールして使ってみた。
MAC OSX(Yosemite)へのインストールはhttps://kiskeyix.org/articles/605を参考にした。
以下で、pythonとの比較と自分用につまづきやすいポイントのメモを。
pythonと同様にインターラクティブなモードで実行する方法と、ファイルに保存して実行する方法(拡張子は.mとする)がある。
インターラクティブな方の使い方は、pythonとほとんど同じ(terminalからpython or octaveと叩いて入る)。
ファイルに保存して実行する場合はpythonと同様に、terminalでファイルを置いているフォルダまで移動して"octave file_name.m"とする方法の他に、インターラクティブなモードでfile_nameとタイプして実行する方法がある。その際、インターラクティブなモードでcdでファイルを置いているフォルダまで移動する。
また、pythonと同様にあるファイル(pythonでいうモジュール)に保存した関数を別のファイル(スクリプトファイル)から読み込んで使うことができる。ただし、その仕様が結構違う。
pythonの場合は、あるファイルmy_module.pyに保存した関数my_func()を使うには、実行するファイルで
import my_module
my_module.my_func()
とします。
もちろん、一つのモジュールファイルの中に幾つかの関数を入れることも出来た。
一方、Octaveでは、スクリプトファイルはpythonとほとんど同じだが、呼び出す関数を保存しておくファイルは関数mファイルと呼ばれ、以下のような制約がある(どちらも拡張子は.m)。
関数名とファイル名は同じでないとダメで、その中身は関数の定義から始める。
関数名とファイル名の名前が一致していないと、
warning: function name 'func_name' does not agree with function file name '/Users/uesr_name/Desktop/test/file_name.m'
とエラーがでる。
また、関数mファイルを実行することはできない(pythonの場合は.pyファイルは実行されれば、スクリプトファイルとして扱われ、importされればモジュールとして扱われていた)。
関数mファイルなのか、スクリプトmファイルなのかは、ファイルの中身が関数の定義で始まるのか、そうでないのかによって決まる。
すなわち、
function y = func_name(x) y = x + 1; end
みたいな感じで、functionで始まるかどうかで決まる。
従って、スクリプトファイルの中で関数を定義するのに、ファイルの一行目から関数を定義しようとすると、関数mファイルとみなされてしまって、実行する際にエラーがでる(僕はここでつまづいた)。
例えば、上のコードをfunc_name.mというファイルの保存して実行しようとすると、
error: 'x' undefined near line 2 column 13
とエラーがでる。
スクリプトmファイルから関数mファイルを呼び出すには、例えば、上の関数だと、
a = 1; b = func_name(a); disp(b);
とする。
ここで、どのファイルから関数を呼ぶか指定していないが、上に書いたように、関数名と関数mファイルの名前は一致させているので、スクリプトファイルと同じフォルダに関数mファイルをおいておけば自動的に探してくれる。
Ref:
http://www.arc.hokkai-s-u.ac.jp/~kusiyama/Inf1_Matlab/Grammar_4.htm
データ解析ツールoctaveを語ろう Part 2
Octaveのスクリプトmファイルと関数mファイルの仕様は、pythonの使用を知っていると、不便に感じてしまう(一つの関数mファイルに複数の関数を定義できないのと、同じ.mファイルでスクリプトmファイルと関数mファイルの両方の機能をもたせられない)。