参考MATLAB中的第二个函数输出



对于一个项目,我有一个可能的激活函数列表可供选择,具体取决于在配置中选择的内容。我希望这些都是g((,这样g就是一个可变函数。同样在每个函数文件中,我都将导数定义为函数Dg((:

function [g Dg]  = identity(x)
g  = x;
Dg = 1
end

我可以参考函数的第一个输出:

g = @identity

但是我如何以类似的方式定义Dg((呢?

你错了,你指的不是函数的第一个输出,而是整个函数。在您的示例中,g变为identity

您可以通过以下操作进行测试:

g = @identity;
[out1,out2]=g(5)

你可以随意重命名

mrpotato = @identity;
[out1,out2]=mrpotato(5)

当您调用一个输出中没有括号的函数时,它只返回1个输出,并且您将该函数命名为与第一个输出相同,这可能会误导您认为您正在捕获第一个输出,但事实并非如此,您只是复制整个函数并将其称为g

@是定义/引用函数的运算符。

对表达式中具有单个输出的函数(如a=something();(的调用将始终返回something()的第一个输出,无论它是函数还是函数的句柄。

一个变通方法是制作一个函数,该函数设计为从给定的句柄返回第二个(或第n个(输出,并通过管道@identity(或任何其他句柄(:

function out=take_second_output(fun,input)
%fun  : function handle
%input: value
[~,out]=fun(input);
end
% More generic version,:
% - works with any number of arguments
% - any of the outputs can be picked
%
% Calling 'a=take_nth_output(fun,n,arg1,arg2,...)' is equivalent to
% '[~,~,...(n-1) times ...,a] = fun(arg1,arg2,...)'
function out=take_nth_output(fun,n_out,varargin)
%fun  : function handle
%n_out: index of the output to be returned
out_tmp=cell(n_out,1);
out_tmp{:} = fun(varargin{:});
out = out_tmp{n_out};
end
% define function handle d
d = @identity;
% define Dg as an anonymous handle
Dg = @(x) take_second_output(@identity,x);
Dg_generic = @(x) take_nth_output(@identity,2,x);

如果要获得函数gDg,可能需要返回函数句柄。类似这样的东西:

function [g,Dg] = identity
g  = @(x) x;
Dg = @(x) 1;
end

现在这行:

[g,Dg] = identity;

将为您提供两个功能,您可以将其用作:

y = g(x);
dy = Dg(x);

一个更复杂的例子是,这里返回的实际函数并不那么复杂,但这表明了机制。您可以创建具有可调参数、流量控制等的复杂功能:

function [g,Dg] = complicated(scale)
g  = @func;
Dg = @deriv_func;
function y = func(x)
y = cos*scale(x);
end
function y = deriv_func(x)
y = -scale*sin(scale*x);
end
end

与以前类似,您现在执行:

[g,Dg] = complicated(4.7);

以获取您的函数句柄。4.7将"嵌入"在这些句柄中,这意味着它会影响函数gDg的含义。

最新更新