动态函数处理Matlab

时间:2019-03-29 19:33:37

标签: matlab function

我具有以下功能句柄

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 

这不起作用。

1 个答案:

答案 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数组中。具有函数名称的字符串不具有相同的功能:您不能通过具有其名称的字符串来调用函数(除非您使用fevaleval)。