MATLAB

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

入れ子関数

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

例 1:データの共有

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

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

% Copyright 1984-2004 The MathWorks, Inc. 
% $Revision: 1.1.8.13.2.2 $  $Date: 2014/02/05 21:22:25 $

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-2004 The MathWorks, Inc. 
% $Revision: 1.1.8.13.2.2 $  $Date: 2014/02/05 21:22:25 $

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);

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

ezplot(f);                             % Plot f over a range of x
hold on;
plot(2,f(2),'d');                      % Plot a marker at (2,f(2))
plot(minimum,f(minimum),'s');          % Plot at minimum of f
text(minimum,f(minimum)-2,'Minimum');
h=ezplot(g); set(h,'color','red')      % Plot g over a range of x
plot(2,g(2),'rd');                     % Plot a marker at (2,g(2))
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-2004 The MathWorks, Inc. 
% $Revision: 1.1.8.13.2.2 $  $Date: 2014/02/05 21:22:25 $

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

製品評価版の入手または製品の購入