#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, но вы не можете легко сделать это с анонимными функциями.