Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

関数のタイプ

ファイルのローカル関数と入れ子関数

プログラム ファイルには複数の関数を含めることができます。ローカル関数と入れ子関数は、プログラムを小さいタスクに分割するときに便利です。これにより、コードが読み取りやすく、維持しやすくなります。

"ローカル関数" は、同じファイル内で利用できるサブルーチンです。ローカル関数を使用することが、プログラム タスクを分割する最も一般的な方法です。関数ファイルの場合は関数定義のみが含まれ、ローカル関数は、ファイル内のメイン関数の後に任意の順序で配置できます。スクリプト ファイルの場合はコマンドと関数定義が含まれ、ローカル関数はファイルの末尾に配置しなければなりません (スクリプト内の関数は、R2016b 以降でサポートされます)。

たとえば、メイン関数 myfunction と 2 つのローカル関数 squareMedoubleMe をもつ、myfunction.m という関数ファイルを作成します。

function b = myfunction(a)
   b = squareMe(a)+doubleMe(a);
end
function y = squareMe(x)
   y = x.^2;
end
function y = doubleMe(x)
   y = x.*2;
end

メイン関数はコマンド ラインまたは別のプログラム ファイルから呼び出せますが、ローカル関数は myfunction のみで使用できます。

myfunction(pi)
ans =
   16.1528

"入れ子関数" は、完全に別の関数内に含まれている関数です。入れ子関数とローカル関数の主な違いは、入れ子関数は親関数で定義された変数を、引数として明示的に受け渡すことなく使用できるということです。

入れ子関数は、コンポーネント間でデータを受け渡すアプリケーションなど、サブルーチンでデータを共有するときに便利です。たとえば、スライダーまたは編集可能なテキスト ボックスを使って 0 と 1 の間の値を設定できる関数を作成します。コールバックに入れ子関数を使用すると、スライダーとテキスト ボックスは値とそれぞれのハンドルを明示的に受け渡しせずに共有できます。

function myslider
value = 0;
f = figure;
s = uicontrol(f,'Style','slider','Callback',@slider);
e = uicontrol(f,'Style','edit','Callback',@edittext,...
                'Position',[100,20,100,20]);

   function slider(obj,~)
      value = obj.Value;
      e.String = num2str(value);
   end
   function edittext(obj,~)
      value = str2double(obj.String);
      s.Value = value;
   end

end

サブフォルダーのプライベート関数

ローカル関数や入れ子関数と同様に、プライベート関数は特定の場所にある関数のみがアクセスできます。ただし、プライベート関数は、プライベート関数を呼び出せる関数と同じファイル内にはありません。private というサブフォルダー内にあります。プライベート関数は、private フォルダーのすぐ上のレベルのフォルダーにある関数のみが使用できます。プライベート関数を使用してコードを別のファイルに分割したり、複数の関連する関数間でコードを共有したりできます。

ファイルなしの無名関数

関数が 1 つのステートメントから構成されていれば、無名関数を使用して、プログラム ファイルを作成せずに関数を定義できます。無名関数の一般的な用途は、まず数式を定義し、MATLAB® の "関数を引数とする関数"、つまり入力に関数ハンドルを受け入れる関数を使用して数式を値の範囲に対して評価することです。

たとえば、以下のステートメントは無名関数に s という関数ハンドルを作成します。

s = @(x) sin(1./x);

この関数は 1 つの入力 x をもっています。@ 演算子が関数ハンドルを作成します。

次のように関数ハンドルを使用し、特定の値に対して関数を評価できます。

y = s(pi)
y = 0.3130

また、関数ハンドルを fplot のような値の範囲で評価する関数に渡すことができます。

range = [0.01,0.1];
fplot(s,range)

関連するトピック