知道函数名称后如何调用Matlab函数

3
假设我有func1func2func3。有没有一种方法可以通过已知参数的名称调用它们?(或它们的指针?处理程序?)例如:
toBeRunned = [ 'func1'; 'func2'; 'func3' ];
// .. foreach entry of toBeRunned call the function with VAR params ..

1
你可能想要使用单元数组(cell()函数和{}字面量)来存储字符串,因为你可以在其中存储不同大小的字符串。请查看Pursuit的答案。 - plesiv
3个回答

7
这就是函数句柄的用途。
toBeRun = {@func1, @func2, @func3};
for ix = 1:length(toBeRun)
    fnArguments = {1, 2, 3, 'four'};
    fnTmp = toBeRun{ix};
    fnTmp(fnArguments{:});
end

关于我们在这里所做的更详细解释:

  1. toBeRun是一个函数句柄的单元数组,只是任意列表。对于作为M文件编写的函数,添加@就足以创建一个函数句柄。

  2. 为了评估该函数,需要将其从单元数组中移出(在本例中移至fnTmp)。这是Matlab的语法限制。您也可以使用fneval,但我通常采用这种方式。

  3. 任何参数都可以按需要添加,以通常的方式进行(例如:fnTmp(1,2,3,'four'))。但是,如果您需要这么多抽象层次,您可能还需要使用任意数量的输入参数。 fnArguments单元数组是实现此目的的一种相当灵活的方式。


3

Function feval:

for i = 1 : size(toBeRunned, 1)
    feval(toBeRunned(i, :), argument);
end

1

实现它的另一种方法...

toBeRunned = { 'func1', 'func2', 'func3' };

% arguments to be provided to functions
VAR = { arg1, arg2, arg3, arg4 };

% preallocate space for results 
results = cell(1, 3);

for i = 1 : length(toBeRunned)
    % KEY part ...
    toRun = eval( [ '@' boBeRunned{i} ] );
    results{i} = toRun( VAR{:} );
end

代码中关键部分的解释:

  • [] 连接字符串,
  • eval 将字符串作为 Matlab 代码进行评估。在循环的第一次迭代中,带有 eval 的行等于:

    toRun = @func1;
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接