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

#matlab

#функция #matlab #аргументы #анонимная функция

Вопрос:

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

 sqr = @(x) x.^2;
  

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

 [b,a] = myAnonymousFunc(x);
  

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

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

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

Ответ №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
  

Комментарии:

1. Идеальный. Теперь я могу определять и использовать функции с однополюсным фильтром так же легко, как это >> opf = @(dt,tc)deal(dt/tc,[1 dt/tc-1]); >> [b,a] = opf(1/44100, 0.0050)

Ответ №2:

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

  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
  

Комментарии:

1. Интересно. Я даже не думал о функции deal.

2. @Chris Я добавил лучший способ решения проблемы возврата других чисел выходных аргументов к моему ответу.

3. @SamRoberts Это выглядит хорошо, хотя вам понадобится несколько ~ s для функций, которые возвращают более 2 значений. Это (одно из мест), где я предпочитаю Python, распаковка кортежей позволяет вам записывать a, _ = func(...) , к чему может быть привязано произвольное количество аргументов _ . AFAIK MATLAB не имеет эквивалента.

4. @Chris Это правда, вы не можете этого сделать в MATLAB. Если бы вы писали обычную функцию, вы могли бы использовать varargout для получения эффекта, аналогичного методу Python, но вы не можете легко сделать это с анонимными функциями.