Function handles, as they are referred to in Matlab, are no more than pointers to functions. Given a function f, @f returns a pointer to that function, just like C.
Unlike C, to dereference the point, you must use the function feval which takes as its first argument a function pointer, and as subsequent arguments, arguments to be given to the function. For example, the following two are identical:
>> sin(3.2) ans = -0.0584 >> feval( @sin, 3.2 ) ans = -0.0584
The function feval passes on the variable nargout as well:
>> [a b] = feval( @size, [1 2 3; 4 5 6] ) a = 2 b = 3 >> feval( @size, [1 2 3; 4 5 6] ) ans = 2 3
The following function takes as its input a function pointer and two end points. It evaluates the function at each of 100 points between a and b and returns the minimum and maximum. Save it to a file fnminmax.m:
function [m, n] = fnminmax( f, a, b ) % FNMINMAX Minumum and maximum of a function by sampling x = linspace( a, b, 100 ); y = ( f, x ); if nargout == 2 m = min( y ); n = max( y ); else m = [min(y), max(y)]; end
We can now call:
>> fnminmax( @sin, 2, 4 ); ans = -0.7568 0.9093
Now, if yhou wanted to find the sampled minimum and maximum of x^2 + 3*sin(x)*x + sin(x)^2, you would have to create a file f.m:
function y = f(x) % F Evaluate x^2 + 3*sin(x)*x + sin(x)^2 y = x.^2 + 3*sin(x).*x + sin(x).^2;
and then you could call:
>> fnminmax( @f, -2, 5 ) ans = 0.0020 11.5357 >> x = linspace( -2, 5, 100 ); >> y = feval( @f, x ); >> plot( x, y )