Что ж, для поиска всех .m-файлов в каталоге вы можете использовать files = what('mydir/');
, а затем обратиться к files.m
, чтобы получить все .m-файлы (включая их расширение).На первый взгляд, я бы использовал eval
для оценки каждой функции, но с другой стороны: ваше решение использовать str2func
выглядит даже лучше.
Так что я думаю, вы могли бы сделать следующее:
function [results] = runAllFiles(T)
files = what('mydir/');
mFiles = arrayfun(@(f) {stripDotM(f)}, files.m);
% strip the '.m' suffix from all the file names
results = cellfun(@(f) {executeStrAsFun(char(f), T)}, mFiles);
% run the files as functions and combine the results in a matrix
end
function [results] = executeStrAsFun(fname, args)
try
fun = str2func(fname); % convert string to a function
results = fun(args); % run the function
catch err
fprintf('Function: %s\n', err.name);
fprintf('Line: %s\n', err.line);
fprintf('Message: %s\n', err.message);
results = ['ERROR: Couldn''t run function: ' fname];
end
end
Проблема, которую я предвижу, заключается в том, что в вашем каталоге есть и функции, и сценарии, но я не знаю (встроенного) способа проверить, является ли файл .m функцией или сценарием.Вы всегда можете проверить содержимое файла, но это может оказаться несколько сложным.