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