おっぱいそん!

pythonを数値計算に使うときのテクニックとかをまとめていきたい。

Octave

とある論文のsupplemental materialにあったMATLAB線形代数のパッケージを詰め込んだ有料ソフト)のコードを動かしたかったので、OctaveMATLABと互換性のある無料ソフト)をインストールして使ってみた。
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ファイルの両方の機能をもたせられない)。