Octave でファイルに記述した関数を実行する(関数ファイル)

関数ファイルの基本

Octave で読み込む外部ファイル (.m) が、関数定義 (function) で始まっていると、そのファイルは 関数ファイル として認識され、組み込み関数のように呼び出せるようになります。

関数ファイルの名前は、ファイルの先頭で定義する関数名に合わせます。 次の例では myfunc という関数を定義しているので、ファイル名は myfunc.m とします。

myfunc.m
function y = myfunc(x)
    y = x**2;
end

上記のように関数ファイルで定義した関数は、組み込み関数と同じ感覚で呼び出すことができます。

>> myfunc(7)
49

サブファンクション

関数ファイルで定義された関数は、先頭で定義した関数だけが公開されます。 例えば、下記の関数ファイルでは、hello 関数と hello2 関数を定義していますが、外部から呼び出せる関数は hello 関数だけであり、hello2 関数はファイル内からのみ呼び出せるサブファンクション として定義されます。

hello.m
% 先頭で定義されているこの関数だけが公開される
function hello()
    disp('hello');
    hello2();
end

% 以降の関数はサブファンクションとみなされて外部には公開されない
function hello2()
    disp('hello2')
end
実行例
>> hello
hello
hello2

>> hello2    % サブファンクションは外からは直接呼び出せない
error: 'hello2' undefined near line 1 column 1

プライベートファンクション

サブファンクションは、定義したファイル内でしか呼び出すことができないので、いろいろな関数から呼び出したいヘルパー関数を作成したいときには都合が悪いです。 このような場合は、ヘルパー関数を プライベートファンクション として別の関数ファイルに分離しておきます。 作成方法は通常の関数ファイルと同様ですが、作成したファイルを private ディレクトリ内に格納するようにします。

下記の例では、通常の関数ファイル hello.m から、プライベートファンクションとして定義された private_func を呼び出しています。

hello.m
function hello()
    disp('hello');
    private_func();
end
private/private_func.m
function private_func()
    disp('private_func');
end
実行例
>> hello()
hello
private_func

1 つのファイルで複数の関数を公開する

関数ファイルでは、先頭で定義した関数しか公開されませんが、複数の関数定義を含んだファイルをスクリプトとして実行してしまうことは可能です。 例えば、下記のように、関数 foo と関数 bar の定義を含んだスクリプトを用意して、これをスクリプトとして読み込めば、2 つの関数を外部から呼び出せるようになります。

functions.m
1;  % Load as a script

function foo()
    disp('foo');
end

function bar()
    disp('bar');
end

先頭が function 定義で始まってしまうと、関数ファイルとして認識されてしまうので、ダミーの 1; というコードを入れて、強制的にスクリプトファイルとして処理されるようにしていることに注意してください。 あとは、このスクリプトを実行すれば、2 つの関数(foobar)を任意のタイミングで呼び出せるようになります。

実行例
>> functions  % スクリプトとして functions.m を実行
>> foo()
foo
>> bar()
bar