Accelerating the pace of engineering and science

# MATLAB

## 入れ子関数

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

```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 ```

```y = taxDemo(80e3) % What is the tax on \$80k income? ```
```y = 2.0720e+04 ```

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

`f``g` は、それぞれ異なる係数をもつ 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; ```

```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 ```

```counter1Value = counter1() ```
```counter1Value = 2 ```
```counter2Value = counter2() ```
```counter2Value = 11 ```