обратитесь к выходу второй функции в MATLAB - PullRequest
0 голосов
/ 22 ноября 2018

Для проекта у меня есть список возможных функций активации на выбор, в зависимости от того, что выбрано в конфигурации.я хочу, чтобы все они были g (), чтобы g была изменяемой функцией.Также в каждом файле функции я определил производную как функцию Dg ():

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

Я могу сослаться на первый вывод функции:

g = @identity

, но какя определяю Dg () аналогичным образом?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вызов функции с одним выходом в выражении, например 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);
0 голосов
/ 22 ноября 2018

Если вы хотите получить функции g и Dg, вы, вероятно, захотите вместо этого вернуть дескрипторы функций.Примерно так:

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

Теперь эта строка:

[g,Dg] = identity;

даст вам две функции, которые вы можете использовать как:

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

Более сложныйНапример, фактические функции, возвращаемые здесь, не так сложны, но это показывает механику.Вы можете создавать сложные функции с настраиваемыми параметрами, управлением потоком и т. Д.: * 10101 *

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.

0 голосов
/ 22 ноября 2018

Вы ошибаетесь, вы не ссылаетесь на первый вывод функции, вы ссылаетесь на всю функцию, подобную этой.в вашем примере g становится identity.

Вы можете проверить это, выполнив:

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

Вы можете переименовать его столько, сколько хотите

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

Возможно, тот факт, что когда вы вызываете функцию без скобок в выводе, она возвращает только 1 вывод, и в связи с этим вы называете функцию такой же, как первый вывод, вводит вас в заблуждение, что вы ловите первый вывод, но это не так, вы просто копируете всю функцию и вызываете ее g

@ - это оператор для определения / ссылки на функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...