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

时间:2018-11-22 11:28:42

标签: matlab

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

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

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

g = @identity

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

3 个答案:

答案 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)

如果要获取函数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的含义。