对于项目,我有一系列可能的激活功能可供选择,具体取决于配置中选择的功能。 我希望这些都是g(),以便g是一个可变函数。 同样在每个函数文件中,我都将派生定义为函数Dg():
function [g Dg] = identity(x)
g = x;
Dg = 1
end
我可以参考该函数的第一个输出:
g = @identity
但是我如何以类似的方式定义Dg()?
答案 0 :(得分:0)
您错了,不是在引用函数的第一个输出,而是在引用整个函数。在您的示例中,g
成为 identity
。
您可以通过以下方法进行测试:
g = @identity;
[out1,out2]=g(5)
您可以根据需要重命名
mrpotato = @identity;
[out1,out2]=mrpotato(5)
可能的事实是,当您在输出中调用不带括号的函数时,它仅返回1个输出,并且您将函数命名为与第一个输出相同,这会误导您以为您正在捕获第一个输出,但这并非如此在这种情况下,您只是复制整个函数并命名为g
@
是定义/引用函数的运算符。
答案 1 :(得分:0)
调用在表达式中具有单个输出的函数(例如a=something();
)将始终返回something()
的第一个输出,无论它是函数还是函数的句柄。
一种解决方法是使函数设计为从给定的任何句柄返回第二个(或第n个)输出,并通过它传递 @identity (或任何其他句柄):< / p>
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);
答案 2 :(得分:0)
如果要获取函数g
和Dg
,则可能要返回函数句柄。像这样:
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将被“嵌入”在这些句柄中,这意味着它会影响功能g
和Dg
的含义。