【问题标题】:Dynamic function handles Matlab动态函数处理 Matlab
【发布时间】:2019-03-29 19:33:36
【问题描述】:

我有以下函数句柄

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 

这行不通。

【问题讨论】:

  • 我已经更新了我的答案。

标签: matlab function


【解决方案1】:

您可能想要做的是创建多个函数句柄,然后动态选择其中一个。例如:

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)。匿名函数是没有名称的函数,但可以分配给函数句柄并以这种方式使用。无论哪种方式,函数句柄都是将函数用作变量的一种方式:您可以将它们作为参数传递给函数,从函数中返回它们,并将它们存储在元胞数组或结构数组中。带函数名的字符串不具有相同的函数:不能通过带函数名的字符串调用函数(除非使用fevaleval)。

【讨论】:

    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多