我有一个功能
function toto(a,b)
[out,~] = evalc(a)
% here I would like to call another function
myFunc(x,y,file);
end
我如何将此函数作为args传递给toto函数,因为有时我想调用toto(a,b)
,有时候调用toto(a,b,@()myFunc(x,y)
?
答案 0 :(得分:2)
(问题编辑前的答案:假定toto
的固定输入数量)
如果要从函数toto
中调用任意函数:首先定义该函数的句柄:
f = @myFunc;
然后将该句柄作为输入参数传递给toto
,以便您可以在toto
中使用它:
function toto(a,b,f)
[out,~] = evalc(a)
f(x,y,file); %// call function whose handle is f
end
答案 1 :(得分:1)
使用输入定义函数以传递函数句柄:
function toto(a,b,fun)
...
% You must know how many inputs and outputs to expect
% but nargin and nargout do work for function handles
% so you can handle different cases if needed.
[y1,y2,...] = fun(x1,x2,...);
...
调用该函数并传入函数句柄:
toto(a,b,@FunName)
或者:
FunHandle = @FunName;
toto(a,b,FunHandle)
您可以使用匿名函数传递其他参数:
Param = 'FileName';
AnonFunHandle = @(x1,x2)FunName(x1,x2,Param);
toto(a,b,AnonFunHandle)
答案 2 :(得分:0)
如果您希望同时使用toto(a,b)
和toto(a,b,f)
或类似的函数调用,则需要使用varargin
和nargin
(及其输出对应项) 。这是一个非常基本的例子;它忽略任何两个以上的输出或任何三个以上的输入,并且不进行任何输入检查等。
function [vargout] = toto(a,b,varargin)
if nargin >2
func = vargin{1};
fout = func(a,b);
else
fout = [] % if no third argument is given returns empty
end
if nargout > 0
varargout{1} = a+b;
end
if nargout > 1
varargout{2} = fout;
end
end
例如,您可以将其称为x = toto(2,3)
(返回x = 5),[x y] = toto(2,3)
(返回x = 5,y = []),[x y] = toto(2,3,@(x,y)(x*y))
(返回x = 5) ,y = 6)。