Matlab:在函数/脚本中运行给定目录中的所有函数

Matlab:在函数/脚本中运行给定目录中的所有函数,matlab,coding-style,Matlab,Coding Style,我对Matlab非常陌生,我正在从更有经验的人那里寻求一些建议 我想写一个函数,它将在给定的目录中循环并运行该目录中的所有matlab函数。实现这一点的最佳/最稳健的方法是什么?我在下面提供了我的实现,但我很担心,因为迄今为止我的大多数matlab经验告诉我,对于我实现的每个函数,通常都有一个等效的matlab内置函数,或者至少有一个更好/更快/更安全的方法来达到相同的目的 我很乐意提供任何其他必要的信息。谢谢 function [results] = runAllFiles(T) fi

我对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

嗯,要查找目录中的所有.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文件是函数还是脚本。您可以随时检查文件的内容,但这可能会有点复杂。

+1用于“what”功能;谢谢我的一个朋友刚刚提出了另一个我没有想到的问题:防止过载(即,如果有人编写了一个名为“size”之类的函数)@akobre01:如果我没有弄错的话,MATLAB应该先在您的工作区中使用该函数,然后再使用您的路径(例如当前目录),然后再使用其他实现。但是,如果覆盖诸如大小之类的内置函数,MATLAB将发出警告。一般来说,我认为应该避免将函数命名为与内置函数相同的函数(除非您确实希望重载行为,但在这种情况下,这些函数只在类中出现)。