«Анонимный» в анонимной функции не относится к неизвестному содержимому. Это относится к тому, что эта функция не имеет статического имени как функция в m-файле.
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
для создания анонимной функции от символического выражения, вы можете указать входные аргументы в вызове matlabFunction
using 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'
Да, это просто дает 'in2' который является массивом аргументов. Опять же, если бы я ничего не знал о функции, как бы я знал, что это за аргументы. Я предполагаю, что это просто характер «анонимных» функций в том, что они действительно анонимны. Чтобы работать с ними, вы должны знать что-то о функции или значении входов. – ThatsRightJack
@ThatsRightJack «Чтобы работать с ними, вы должны знать что-то о функции или значении входов». Это верно для любой функции. – TroyHaskin
Эта функция по-прежнему анонимна, поскольку она не имеет имени. :) – TroyHaskin