MATLAB

数値計算言語

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

入れ子関数

この例では、入れ子関数を使用し、データを簡単に共有したり、カスタマイズ関数を作成したりする方法を示します。

例 1: データの共有

最初に、入れ子関数を含む taxDemo.m を見てみましょう。

type taxDemo.m
function y = taxDemo(income)
%TAXDEMO Used by NESTEDDEMO.
% Calculate the tax on income.

% Copyright 1984-2014 The MathWorks, Inc.

AdjustedIncome = income - 6000; % Calculate adjusted income

% Call 'computeTax' without passing 'AdjustedIncome' as a parameter.

y = computeTax;

   function y = computeTax
      
      % This function can see the variable 'AdjustedIncome'
      % in the calling function's workspace
      y = 0.28 * AdjustedIncome;
   end
end

入れ子関数 computeTax は、親関数のワークスペース内の変数を参照できます。これにより、複数の入れ子関数間で簡単にデータを共有することができるため、大きなデータセットを処理する際に特に役立ちます。通常の方法で関数を 呼び出すことができます。

y = taxDemo(80e3) % What is the tax on $80k income?
y =

   2.0720e+04

入れ子関数については、end ステートメントが関数の終わりに必要です。任意のレベルに関数を入れ子にすることもできます。

例 2: カスタマイズ関数の作成

入れ子関数によってカスタマイズ関数を作成することも可能です。入れ子関数を含む makefcn.m を見てみましょう。

type makefcn.m
function fcn = makefcn(a,b,c)
%MAKEFCN Used by NESTEDDEMO.
% This function returns a handle to a customized version of 'parabola'.
% a,b,c specifies the coefficients of the function.

% Copyright 1984-2014 The MathWorks, Inc.

fcn = @parabola;   % Return handle to nested function

   function y = parabola(x)
      % This nested function can see the variables 'a','b', and 'c'
      y = a*x.^2 + b.*x + c;
   end
end

makefcn を呼び出すと、カスタマイズ関数の関数ハンドルが返されます。以下に例を示します。

f = makefcn(3,2,10);
g = makefcn(0,5,25);

fg は、それぞれ異なる係数をもつ 2 つの関数のハンドルです。これらの関数ハンドルを使用し、パラメーターを渡すことで関数を評価することができます。

y = f(2)
y =

    26

y = g(2)
y =

    35

最適化、積分など、関数を引数とする関数にハンドルを渡すことも可能です。

minimum = fminbnd(f,-5,5);

または、ある範囲にわたって関数をプロットします。

fplot(f, [-6 6], 'b-')                  % Plot f over a range of x
hold on;
plot(2,f(2),'bd');                      % Plot a marker at (2,f(2))
plot(minimum,f(minimum),'bs');          % Plot at minimum of f
text(minimum,f(minimum)-2,'Minimum');
fplot(g, [-6 6], 'r-')
plot(2,g(2),'rd');                      % Plot a marker at (2,g(2))
ylim([-10 60])
hold off;

例 3: 状態をもつカスタマイズ関数の作成

入れ子関数を含む makecounter.m を見てみましょう。

type makecounter.m
function countfcn = makecounter(initvalue)
%MAKECOUNTER Used by NESTEDDEMO.
% This function returns a handle to a customized nested function 'getCounter'.
% initvalue specifies the initial value of the counter whose's handle is returned.

% Copyright 1984-2014 The MathWorks, Inc.

currentCount = initvalue; % Initial value
countfcn = @getCounter;   % Return handle to getCounter

   function count = getCounter
      % This function increments the variable 'currentCount', when it
      % gets called (using its function handle) .
      currentCount = currentCount + 1;
      count = currentCount;
   end
end

makecounter を呼び出すと、入れ子関数 getCounter のハンドルが返されます。getCounter は、makecounter のワークスペース内で入れ子にすることで参照できる変数 initvalue の値でカスタマイズされます。

counter1 = makecounter(0);  % Define counter initialized to 0
counter2 = makecounter(10); % Define counter initialized to 10

2 つのカスタマイズ カウンターを作成しました。1 つは 0 で始まるもので、もう 1 つは 10 で始まるものです。それぞれのハンドルは関数と呼び出し側のワークスペースの個別のインスタンスです。そのハンドルによって内部の入れ子関数を呼び出せます。counter1 は、パラメーターを取りませんが、値を取得することはできます。

counter1Value = counter1()
counter1Value =

     1

親関数について 2 つの別々のワークスペースが確保されているので、2 つの関数を個別に呼び出せます。それらの入れ子関数へのハンドルが存在する間、それらはメモリに残ります。この場合、counter1 が呼び出されると、currentCount 変数は更新されます。

counter1Value = counter1()
counter1Value =

     2

counter2Value = counter2()
counter2Value =

    11