我具有以下功能句柄
rhs = @(t,p,m) function_name (t,p,m,variables)
我需要在上面的调用中动态命名function_name
,以便稍后可以在代码的其他部分调用句柄
例如:
odesolver(rhs);
我尝试过例如:
function_names_array = ['function_1','function_2','function_3'];
paramters_array = [parameters_array_1,parameters_array_2,parameters_array_3]
for i=1:3
for j= 1:5
rhs = @(t,p,m) function_names_array(i)(t,p,m,parameters(j))
end
end
这不起作用。
答案 0 :(得分:2)
可能您想要做的是创建多个函数句柄,然后动态选择其中一个。例如:
functions = {@function_1, @function_2, @function_3};
parameters = {
{1,[10,20],'a'}
{2,[10,20],'c'}
{3,[100,200],'a'}};
for i=1:numel(functions)
for j=1:numel(parameters)
rhs{i,j} = @(t,p,m) functions{i}(t,p,m,parameters{j}{:})
end
end
odesolver(rhs{2,4});
不可能创建一个函数句柄数组(语法会模棱两可),但是可以如上所述将它们收集到单元格数组中。
参数也收集在单元格数组中,这提供了很大的灵活性。每组参数还是单元格数组。 parameters{j}{:}
是单元格数组j
中元素的逗号分隔列表,非常适合用作函数调用中的参数列表。
关于术语:
@function_1
是命名函数的句柄。 @()...
是一个匿名函数(在其他语言中称为lambda)。匿名函数是没有名称的函数,但是可以分配给函数句柄并以这种方式使用。无论哪种方式,函数句柄都是将函数用作变量的一种方式:您可以将它们作为参数传递给函数,从函数中返回它们,并将它们存储在单元格数组或struct数组中。具有函数名称的字符串不具有相同的功能:您不能通过具有其名称的字符串来调用函数(除非您使用feval
或eval
)。