Другой вариант (в дополнение к Amro's ) заключается в использовании функциональных ручек :
fileList = {@file1 @file2 @file3}; % A cell array of function handles
for iFile = 1:numel(fileList)
fileList{iFile}(); % Evaluate the function handle
pause % Wait for a keypress to continue
end
Вы можете вызвать функцию, используя ее дескриптор , как я делал выше, или используя функцию FEVAL . Если у вас есть имя функции в строке, вы можете использовать функцию STR2FUNC , чтобы преобразовать ее в дескриптор функции (при условии, что это не вложенная функция , для которой требуется дескриптор функции конструктор @
). Следующий пример иллюстрирует каждую из этих альтернатив:
fileList = {str2func('file1') str2func('file2') str2func('file3')};
for iFile = 1:numel(fileList)
feval(fileList{iFile}); % Evaluate the function handle
pause % Wait for a keypress to continue
end
Чем отличаются два ответа?
Вам может быть интересно, в чем разница между моим ответом (с помощью дескрипторов функций) и Amro (с использованием строк). Для очень простых случаев вы, скорее всего, не увидите никакой разницы. Однако вы можете столкнуться с более сложными проблемами определения объема и приоритетов функций , если вы используете строки для имен функций и оцениваете их с помощью EVAL . Вот пример для иллюстрации ...
Допустим, у нас есть два m-файла:
fcnA.m
function fcnA
disp('I am an m-file!');
end
fcnB.m
function fcnB(inFcn)
switch class(inFcn) % Check the data type of inFcn...
case 'char' % ...and do this if it is a string...
eval(inFcn);
case 'function_handle' % ...or this if it is a function handle
inFcn();
end
end
function fcnA % A subfunction in fcnB.m
disp('I am a subfunction!');
end
Функция fcnB
предназначена для получения имени функции или дескриптора функции и его оценки. По случайному совпадению (или, возможно, умышленно) в fcnB.m есть подфункция, которая также называется fcnA
. Что происходит, когда мы называем fcnB
двумя разными способами?
>> fcnB('fcnA') % Pass a string with the function name
I am a subfunction!
>> fcnB(@fcnA) % Pass a function handle
I am an m-file!
Обратите внимание, что передача имени функции в виде строки вызывает оценку подфункции fcnA
. Это связано с тем, что в тот момент, когда EVAL вызывается, подфункция fcnA
имеет наивысший приоритет функции из всех функций с именем fcnA
. Напротив, передача дескриптора функции приводит к тому, что вместо этого вызывается m-файл fcnA
. Это связано с тем, что дескриптор функции сначала создается , а затем передается fcnB
в качестве аргумента. M-файл fcnA
является единственным по объему (т. Е. Единственным, который может быть вызван) вне fcnB
и, таким образом, является тем, к которому привязан дескриптор функции.
В целом, я предпочитаю использовать дескрипторы функций, потому что я чувствую, что это дает мне больше контроля над тем, какая конкретная функция вызывается, что позволяет избежать непредвиденного поведения, как в приведенном выше примере.