| Programming and Data Types |
関数ハンドルの計算の例題
この節は、関数ハンドルの使い方や計算法を示す2つの例題を示します。
例題 1 - 簡単な関数ハンドル
plot_fhandleと云う名前の関数を定義するつぎの例題は、関数ハンドルとデータを受け取り、そのデータに関して、関数ハンドルの計算を行なうものです。
function x = plot_fhandle(fhandle, data) plot(data, feval(fhandle, data))
関数sinと下に示す引数を関数と共に、plot_fhandleをコールすると、求まる計算結果は、つぎのプロットを作成します。
plot_fhandle(@sin, -pi:0.01:pi)![]()
例題 2 - 関数ハンドルとサブ関数
この例題の中のM-ファイルは、主関数fitcurvedemoとサブ関数
expfunです。定義として、サブ関数は、自身のM-ファイルのスコープの中のみで見ることができます。もちろん、そのM-ファイルの中の他の関数での使用だけは、可能です。
このコードのオーサは、このM-ファイルの範囲の外で、expfun
を使おうとしています。この例題は、関数ハンドルをサブ関数expfunに作成し、サブ関数に関するアクセス情報を捕らえ、MATLAB環境の中の任意の位置からコールするものです。関数ハンドルは、fminsearchに渡し、通常のスコープの外側でサブ関数をうまく計算するものです。
下に示すコードは、fitcurvedemoとサブ関数expfunを定義するものです。ライン6は、関数ハンドルをexpfunに作成し、それを変数funに割り当てます。ライン16で、fminsearchへのコールで、サブ関数の通常のスコープの外側に関数ハンドルを渡します。関数
fminsearch は、fevalを使って、そのハンドルを通して、サブ関数を計算します。
1 function Estimates = fitcurvedemo
2 % FITCURVEDEMO
3 % Fit curve to data where user chooses equation to fit.
4
5 % Define function and starting point of fitting routine.
6 fun = @expfun;
7 Starting = rand(1, 2);
8
9 % First, we create the data.
10 t = 0:.1:10; t=t(:); % to make 't' a column vector
11 Data = 40 * exp(-.5 * t) + randn(size(t));
12 m = [t Data];
13
14 % Now, we can call FMINSEARCH:
15 options = optimset('fminsearch'); % Use FMINSEARCH defaults
16 Estimates = fminsearch(fun, Starting, options, t, Data);
17
18 % To check the fit
19 plot(t, Data, '*')
20 hold on
21 plot(t, Estimates(1) * exp(-Estimates(2) * t), 'r')
22 xlabel('t')
23 ylabel('f(t)')
24 title(['Fitting to function ', func2str(fun)]);
25 legend('data', ['fit using ', func2str(fun)])
26 hold off
27
28 % ----------------------------------------------------------
29
30 function sse = expfun(params, t, Data)
31 % Accepts curve parameters as inputs, and outputs fitting the
32 % error for the equation y = A * exp(-lambda * t);
33 A = params(1);
34 lambda = params(2);
35
36 Fitted_Curve = A .* exp(-lambda * t);
37 Error_Vector = Fitted_Curve - Data;
38
39 % When curve fitting, a typical quantity to minimize is the sum
40 % of squares error
41 sse = sum(Error_Vector .^ 2);
| ハンドルを使って関数を計算 | 関数ハンドル情報の表示 |