Подтвердить что ты не робот

Требуется: пример использования Matlab анонимной функции, возвращающей более 1 вывода

Я использую анонимные функции для простых преобразований значений данных. Анонимные функции определяются следующим синтаксисом

sqr = @(x) x.^2;

Я хотел бы иметь простую анонимную функцию, которая возвращает более одного вывода, который можно использовать следующим образом.,.

[b,a] = myAnonymousFunc(x);

Документация Matlab предполагает, что это возможно, но не дает примера синтаксиса, необходимого для определения такой функции.

http://www.mathworks.co.uk/help/techdoc/matlab_prog/f4-70115.html#f4-71162

Каков синтаксис для определения такой функции [ в одной строке, например, пример кода в верхней части моего сообщения)?

4b9b3361

Ответ 1

Это делает то, что вам нужно?

>> f = @(x)deal(x.^2,x.^3);
>> [a,b]=f(3)
a =
     9
b =
    27

В этом примере вам нужно убедиться, что вы вызываете только f только с двумя выходными аргументами, иначе это приведет к ошибке.

ИЗМЕНИТЬ

По крайней мере, с недавними версиями MATLAB, вы можете вернуть только некоторые из выходных аргументов, используя синтаксис ~:

>> [a,~]=f(3)
a =
     9
>> [~,b]=f(3)
b =
    27

Ответ 2

Если вы не хотите пропускать выходные данные с помощью тильды ~ или выводить массив ячеек, вам потребуется только вспомогательная анонимная функция:

 deal2 = @(varargin) deal(varargin{1:nargout});
 myAnonymousFunc = @(x) deal2(x.^2, x.^3);

тогда вы можете получить только первый выходной аргумент или первый и второй:

x = 2;
[b,a] = myAnonymousFunc(x)
b = myAnonymousFunc(x)

:

b =      4

a =      8

b =      4

Ответ 3

Вы можете получить несколько выходов из анонимной функции, если вызываемая функция возвращает больше одного вывода. Смотрите это сообщение в блоге на веб-сайте MathWorks, чтобы привести примеры этого в действии.

Существует два способа получения нескольких выходов из анонимной функции:

  • Вызвать функцию, которая возвращает несколько выходов

    В блоге, связанном с ним, они используют функцию eig так

    fdoubleEig = @(x) eig(2*x)
    [e, v] = fdoubleEig(magic(3))
    
  • В качестве альтернативы вы можете создать анонимную функцию, которая возвращает несколько выходов с помощью функции deal.

    Вот один из них:

    >>> f = @(x, y, z) deal(2*x, 3*y, 4*z)
    >>> [a, b, c] = f(1, 2, 3)
    
    a = 
         2
    b = 
         6
    c = 
         12
    

Изменить. Как отметил Сэм Робертс, и в сообщении блога, на которое я ссылаюсь, вы должны использовать правильное количество выходных аргументов при использовании deal, иначе возникает ошибка. Один из способов - вернуть ячейку результатов. Например

>>> f = @(x, y, z) {2*x, 3*y, 4*z}

>>> t = f(1, 2, 3)

>>> [a, b, c] = t{:}

    a = 
         2
    b = 
         6
    c = 
         12