gpt4 book ai didi

loops - MATLAB:循环调用 .m 文件

转载 作者:行者123 更新时间:2023-12-01 22:11:30 25 4
gpt4 key购买 nike

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

最佳答案

另一个选项(除了 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 ,它需要函数句柄构造函数 @)。以下示例说明了每种替代方案:

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
<小时/>

这两个答案有何不同?

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

假设我们有两个 m 文件:

fcnA.m

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

fcnB.m

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旨在获取函数名称或函数句柄并对其进行评估。不幸的是,巧合(或者可能是有意为之),fcnB.m 中有一个子函数,也称为 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!

请注意,将函数名称作为字符串传递会导致对子函数 fcnA 进行求值。这是因为在调用 EVAL 时,子函数 fcnA 具有最高的function precedence。所有名为 fcnA 的函数。相反,传递函数句柄会导致调用 m 文件 fcnA。这是因为函数句柄首先被创建,然后作为参数传递给 fcnB。 m 文件 fcnAfcnB 之外范围内唯一的文件(即唯一可以调用的文件),因此是函数句柄所绑定(bind)的文件.

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

关于loops - MATLAB:循环调用 .m 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com