2016-04-17 2 views
-1

Я довольно новичок в анонимных функциях, и я не смог найти что-либо с помощью поиска в Google, поэтому я подумал, что приеду сюда за помощью. Для символьной функции я могу использовать symvar для определения зависимостей функций. Существует ли эквивалент для анонимных функций?Аргументы анонимных аргументов Matlab

Пример: Эта функция сообщает вам, как превратить воду в золото

afun = @(temp,pressure,volume,time,mass) ... 

Помимо disp(afun), есть способ, чтобы захватить зависимые переменные с функцией как symvar, где переменная листинга вход может быть сохранен в другой переменной? Например test = symvars (afun), где symvar заменяется чем-то, связанным с анонимными функциями. Другими словами, я бы хотел, чтобы «тест» был массивом, равным «темп, давление, объем, время, масса»?

ответ

2

«Анонимный» в анонимной функции не относится к неизвестному содержимому. Это относится к тому, что эта функция не имеет статического имени как функция в m-файле.

Например, если вы создаете следующую функцию, то может использоваться только , ее имя, myfunction.

function out = myfunction(a,b) 

С функцией ручкой, однако, присваиваются переменным и имени этого переменного используются для вызова функции.

myfunc = @(a,b)disp('I am a walrus'); 
myfunc2 = myfunc; 

Теперь же функция может быть вызвана с помощью либоmyfunc() или myfunc2().

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

f = @(a,b)disp('I am a sneaky function'); 
disp(f) 

    f = @(a,b)disp('I am a sneaky function'); 

Из этого легко сделать вывод, что f принимает два входных аргумента (a и b).

Насколько эти входные аргументы должны быть и что эта функция делает с этими аргументами, вам придется посмотреть на компонент функции дескриптора функции или спросить, кто его создал. Если вы не можете сказать, это не делает его «анонимным», это просто делает его плохо документированным.

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

%// Get the number of input arguments 
nargin(f) 

Update

Если вы использовали matlabFunction для создания анонимной функции от символического выражения, вы можете указать входные аргументы в вызове matlabFunctionusing the Vars input.

В качестве примера from the documentation.

syms x y z t 
r = (x + y/2 + z/3)*exp(-t); 

%// The first input argument will be t and the second will be an array of [x,y,z] 
matlabFunction(r, 'Vars', {t,[x y z]}); 
%// @(t,in2)exp(-t).*(in2(1)+in2(2).*(1.0./2.0)+in2(3).*(1.0./3.0)); 

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

syms x y z 
r = x + y/2 + z/3; 
matlabFunction(r, 'Vars', [x,y,z]); 
%// @(x,y,z)x+y.*(1.0./2.0)+z.*(1.0./3.0); 

Если вы не укажете их, MATLAB автоматически выбирает порядок, как указано в документации:

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

Update 2

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

anoninputs = @(f)strsplit(regexp(func2str(f), '(?<=^@\()[^\)]*', 'match', 'once'), ','); 

Теперь мы можем проверить это нравится:

f = @(a,b)disp('Just another function. Do not mind me'); 

anoninputs(f) 

    'a' 'b' 
+0

Да, это просто дает 'in2' который является массивом аргументов. Опять же, если бы я ничего не знал о функции, как бы я знал, что это за аргументы. Я предполагаю, что это просто характер «анонимных» функций в том, что они действительно анонимны. Чтобы работать с ними, вы должны знать что-то о функции или значении входов. – ThatsRightJack

+2

@ThatsRightJack «Чтобы работать с ними, вы должны знать что-то о функции или значении входов». Это верно для любой функции. – TroyHaskin

+1

Эта функция по-прежнему анонимна, поскольку она не имеет имени. :) – TroyHaskin

Смежные вопросы