假设我有func1
和。有没有办法用定义了它们的名字的已知参数来调用它们?(或者他们的指针?处理程序?)func2
func3
就像是:
toBeRunned = [ 'func1'; 'func2'; 'func3' ];
// .. foreach entry of toBeRunned call the function with VAR params ..
假设我有func1
和。有没有办法用定义了它们的名字的已知参数来调用它们?(或者他们的指针?处理程序?)func2
func3
就像是:
toBeRunned = [ 'func1'; 'func2'; 'func3' ];
// .. foreach entry of toBeRunned call the function with VAR params ..
这就是函数句柄的用途。
toBeRun = {@func1, @func2, @func3};
for ix = 1:length(toBeRun)
fnArguments = {1, 2, 3, 'four'};
fnTmp = toBeRun{ix};
fnTmp(fnArguments{:});
end
关于我们在这里所做的事情的更多解释:
toBeRun 是一个函数句柄元胞数组,只是一个任意列表。对于编写为 M 文件的函数,添加了@
创建函数句柄所需的全部内容。
为了评估函数,需要将其从元胞数组中删除(fnTmp
在本例中为删除)。这是 Matlab 的语法限制。您也可以使用fneval
,但我通常这样做。
可以根据需要以通常的方式(例如fnTmp(1,2,3,'four')
)添加任何参数。但是如果你需要这么多的抽象,你可能还需要使用任意数量的输入参数。单元格fnArguments
是完成此任务的一种非常灵活的方式。
功能feval
:
for i = 1 : size(toBeRunned, 1)
feval(toBeRunned(i, :), argument);
end
实现它的另一种方法...
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;