3

假设我有func1和。有没有办法用定义了它们的名字的已知参数来调用它们?(或者他们的指针?处理程序?)func2func3

就像是:

toBeRunned = [ 'func1'; 'func2'; 'func3' ];
// .. foreach entry of toBeRunned call the function with VAR params ..
4

3 回答 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是完成此任务的一种非常灵活的方式。

于 2012-11-12T20:15:47.880 回答
3

功能feval

for i = 1 : size(toBeRunned, 1)
    feval(toBeRunned(i, :), argument);
end
于 2012-11-12T20:16:20.287 回答
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;
    
于 2013-01-15T03:02:19.677 回答