Matlab: запуск всех функций в данном каталоге в функции / скрипте - PullRequest
3 голосов
/ 20 июня 2011

Я очень новичок в Matlab и ищу совета от кого-то более опытного.

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

Я был бы рад предоставить любую другую необходимую информацию.Спасибо!

function [results] = runAllFiles(T)
    files   = dir('mydir/');
    % get all file names in mydir

    funFile = files(arrayfun(@(f) isMatFun(f), files)); 
    % prune the above list to get a list of files in dir where isMatFun(f) == true

    funNames  = arrayfun(@(f) {stripDotM(f)}, funFiles);
    % strip the '.m' suffix from all the file names     

    results = cellfun(@(f) {executeStrAsFun(char(f), T)}, funNames);
    % 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

1 Ответ

3 голосов
/ 20 июня 2011

Что ж, для поиска всех .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 функцией или сценарием.Вы всегда можете проверить содержимое файла, но это может оказаться несколько сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...