将函数名传递给另一个函数,并在MATLAB中输入参数

将函数名传递给另一个函数,并在MATLAB中输入参数,matlab,function,parameter-passing,user-input,Matlab,Function,Parameter Passing,User Input,问题陈述:我正在尝试为一个主调用函数(如下面的run_实验)编写MATLAB代码,以指定在使用其他MATLAB函数按顺序进行计算的情况下,我要执行哪些计算。这些其他函数将根据主调用函数传递的参数进行评估。在计算中使用的上述函数应指定它们所用脚本的名称 示例所需的代码行为:例如,类似以下的命令应运行预处理\u数据、初始化\u模型和训练\u模型脚本 此命令应仅运行train_模型脚本,还应评估其性能: >> run_experiment('dataset_1_options', '|tr

问题陈述:我正在尝试为一个主调用函数(如下面的run_实验)编写MATLAB代码,以指定在使用其他MATLAB函数按顺序进行计算的情况下,我要执行哪些计算。这些其他函数将根据主调用函数传递的参数进行评估。在计算中使用的上述函数应指定它们所用脚本的名称

示例所需的代码行为:例如,类似以下的命令应运行预处理\u数据、初始化\u模型和训练\u模型脚本

此命令应仅运行train_模型脚本,还应评估其性能:

>> run_experiment('dataset_1_options', '|train_model|evaluate_model|');
在上述示例中,“|”用作分隔符,用于指定要计算的单独函数名。这些函数使用dataset_1_选项指定的选项。请不要把重点放在如何将输入的那部分分离成有意义的函数名上;我知道如何使用strsplit

约束和规范:作为输入传递给主调用函数的函数名不是匿名函数目的是能够将多个函数名作为输入传递,并使用上述示例中的选项对其进行评估。它们返回要在研究代码的其他部分进行评估的输出(即,将数据矩阵传递给研究代码内的其他函数,作为在其内执行的计算结果)

问题:鉴于上述所需的行为和约束,有人能帮助您将另一个调用函数的单独函数名以及选项/参数传递给这些函数吗?主调用函数应该如何使用调用期间指定的选项计算作为输入传入的函数名


提前谢谢。

您可以在matlab中将函数传递给函数。你只需要在通过时使用@符号。在您的例子中,它将在脚本中运行实验(“dataset_1_options”,“train_model”)。您可以将选项保存在单元格数组或其他内容中。run_实验函数只是一个常规函数

function [output] = run_experiment(options, train_model, ...);
train_model(options{1}, ...)
.
.
.
end

您需要做的是创建一个包含函数名的单元格数组和另一个包含相应选项的数组,如下所示

% Function name array
fn_array = {@fn_1, @fn_2, ...};
% Option array
option_array = {{fn1_opt1, fn2opt2, ...}; {fn2_opt1, fn2_opt2, ...};, ...};
这两个函数需要传递给run_实验函数,该函数将对它们进行评估,如下所示

function run_experiment(fn_array, option_array)
num_fn = length(fn_array); %Finds number of functions to evaluate
for ii = 1:num_fn %Evaluates each function
    fn_array{ii}(option_array{ii}{:});
end

但是我想指定多个函数名,就像在我的示例中指定所需的代码行为一样。根据我对定义这些函数的脚本名的选择,这些函数名将是一个接一个地执行的不同函数名。因此,你不能使用我上面描述的方法放入多个函数吗?您可以使用if语句对它们进行求值。如果传递的参数是函数,则可以使用matlab isa函数来检测类型。我认为这可能是使用varargin的原因。varargin可以让您作为单元格数组输入可变数量的参数。在run_实验代码中,您可以使用if语句来检测函数。
function run_experiment(fn_array, option_array)
num_fn = length(fn_array); %Finds number of functions to evaluate
for ii = 1:num_fn %Evaluates each function
    fn_array{ii}(option_array{ii}{:});
end