MATLAB:在循环中调用.m文件

时间:2009-11-01 20:55:25

标签: loops matlab

如何在循环中调用3个MATLAB .m 文件并按顺序显示结果?

2 个答案:

答案 0 :(得分:5)

另一个选项(除Amro's之外)是使用function handles

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

您可以像我上面所做的那样call a function using its handle或使用FEVAL功能。如果字符串中有函数名,则可以使用函数STR2FUNC将其转换为函数句柄(假设它不是nested function,这需要函数句柄构造函数{{1} })。以下示例说明了这些替代方案中的每一个:

@

这两个答案有何不同?

您可能想知道我的答案(使用函数句柄)和Amro's(使用字符串)之间的区别。对于非常简单的情况,您可能会看到没有区别。但是,如果对函数名称使用字符串并使用scoping and function precedence issues对其进行评估,则可能会遇到更复杂的EVAL。这是一个例子来说明......

假设我们有两个m文件:

fcnA.m

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

fcnB.m

function fcnA
  disp('I am an m-file!');
end

函数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.m 中有一个子功能,也称为fcnB。当我们以两种不同的方式致电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! 。这是因为在调用EVAL时,子功能fcnA具有名为fcnA的所有函数中最高function precedence。相反,传递函数句柄会导致调用m文件fcnA。这是因为函数句柄是先创建 ,然后作为参数传递给fcnA。 m文件fcnBfcnA之外唯一的范围(即唯一可以调用的文件),因此是函数句柄所依赖的文件。

一般来说,我更喜欢使用函数句柄,因为我觉得它让我可以更好地控制调用哪个特定函数,从而避免出现意外行为,如上例所示。

答案 1 :(得分:1)

假设您的文件是scripts,其中包含绘图命令,您可以执行以下操作:

mfiles = {'file1' 'file2' 'file3'};
for i=1:length(mfiles)
    eval( mfiles{i} );
    pause
end
例如,我们有:

file1.m

x = 0:0.1:2*pi;
plot(x, sin(x))