samer@39
|
1 function h=mtimes(f,g)
|
samer@12
|
2 % compose - Constructs composition of two functions
|
samer@12
|
3 %
|
samer@39
|
4 % compose :: (B{:}->C{:}), (A{:}->B{:}) -> (A{:}->C{:}).
|
samer@12
|
5 %
|
samer@12
|
6 % returns the function h such that h(...) = f(g(...))
|
samer@39
|
7 % If functions have multiple returns and arguments, outputs
|
samer@39
|
8 % from g are routed to f.
|
samer@12
|
9
|
samer@12
|
10 h=@fg;
|
samer@39
|
11 n1=nargout(g); if n1<0, n1=inf; end
|
samer@39
|
12 n2=nargin(f); if n2<0, n2=inf; end
|
samer@39
|
13 n3=nargout(f); if n3<0, n3=inf; end
|
samer@39
|
14 nint=min(n1,n2);
|
samer@39
|
15 if ~isfinite(nint), error('Cannot determine number of intermediate values'); end
|
samer@39
|
16
|
samer@39
|
17 fns = { @q00, @q01, @q0n; @q10, @q11, @q1n; @qn0, @qn1, @qnn };
|
samer@39
|
18 h=fns{ acount(nint,1)+1, acount(n3,1)+1};
|
samer@39
|
19
|
samer@39
|
20 function q00(varargin), g(varargin{:}); f(); end
|
samer@39
|
21 function q10(varargin), f(g(varargin{:})); end
|
samer@39
|
22 function qn0(varargin), [y{1:nint}]=g(varargin{:}); f(y{:}); end
|
samer@39
|
23 function x=q01(varargin), g(varargin{:}); x=f(); end
|
samer@39
|
24 function x=q11(varargin), x=f(g(varargin{:})); end
|
samer@39
|
25 function x=qn1(varargin), [y{1:nint}]=g(varargin{:}); x=f(y{:}); end
|
samer@39
|
26 function varargout=q0n(varargin), g(varargin{:}); [varargout{1:nargout}]=f(); end
|
samer@39
|
27 function varargout=q1n(varargin), [varargout{1:nargout}]=f(g(varargin{:})); end
|
samer@39
|
28 function varargout=qnn(varargin), [y{1:nint}]=g(varargin{:}); [varargout{1:nargout}]=f(y{:}); end
|
samer@12
|
29 end
|