假设我有func1
,func2
和func3
。有没有办法用已知的参数来定义他们的名字来调用它们? (或者他们的指针?处理程序?)
类似的东西:
toBeRunned = [ 'func1'; 'func2'; 'func3' ];
// .. foreach entry of toBeRunned call the function with VAR params ..
答案 0 :(得分:7)
这是函数句柄的用途。
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
单元格是实现此目的的一种非常灵活的方式。
答案 1 :(得分:3)
功能feval
:
for i = 1 : size(toBeRunned, 1)
feval(toBeRunned(i, :), argument);
end
答案 2 :(得分: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
代码 key 部分的说明:
[]
连接字符串, eval
将字符串评估为Matlab代码。在循环的第一次迭代中,eval
的行等于:
toRun = @func1;