Требуется: пример использования 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
Каков синтаксис для определения такой функции [ в одной строке, например, пример кода в верхней части моего сообщения)?
Ответы
Ответ 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