在另一个函数内调用函数

时间:2013-12-17 15:58:46

标签: matlab

我有一个功能

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)

3 个答案:

答案 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)或类似的函数调用,则需要使用vararginnargin(及其输出对应项) 。这是一个非常基本的例子;它忽略任何两个以上的输出或任何三个以上的输入,并且不进行任何输入检查等。

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)。