関数ファイルの基本
Octave で読み込む外部ファイル (.m
) が、関数定義 (function
) で始まっていると、そのファイルは 関数ファイル として認識され、組み込み関数のように呼び出せるようになります。
関数ファイルの名前は、ファイルの先頭で定義する関数名に合わせます。
次の例では myfunc
という関数を定義しているので、ファイル名は myfunc.m
とします。
function y = myfunc(x)
y = x**2;
end
上記のように関数ファイルで定義した関数は、組み込み関数と同じ感覚で呼び出すことができます。
>> myfunc(7)
49
サブファンクション
関数ファイルで定義された関数は、先頭で定義した関数だけが公開されます。
例えば、下記の関数ファイルでは、hello
関数と hello2
関数を定義していますが、外部から呼び出せる関数は hello
関数だけであり、hello2
関数はファイル内からのみ呼び出せるサブファンクション として定義されます。
% 先頭で定義されているこの関数だけが公開される
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
を呼び出しています。
function hello()
disp('hello');
private_func();
end
function private_func()
disp('private_func');
end
>> hello()
hello
private_func
1 つのファイルで複数の関数を公開する
関数ファイルでは、先頭で定義した関数しか公開されませんが、複数の関数定義を含んだファイルをスクリプトとして実行してしまうことは可能です。
例えば、下記のように、関数 foo
と関数 bar
の定義を含んだスクリプトを用意して、これをスクリプトとして読み込めば、2 つの関数を外部から呼び出せるようになります。
1; % Load as a script
function foo()
disp('foo');
end
function bar()
disp('bar');
end
先頭が function
定義で始まってしまうと、関数ファイルとして認識されてしまうので、ダミーの 1;
というコードを入れて、強制的にスクリプトファイルとして処理されるようにしていることに注意してください。
あとは、このスクリプトを実行すれば、2 つの関数(foo
と bar
)を任意のタイミングで呼び出せるようになります。
>> functions % スクリプトとして functions.m を実行
>> foo()
foo
>> bar()
bar