【问题标题】:Passing names of functions to another function with parameters as input in MATLAB将函数名称传递给另一个函数,其中参数作为 MATLAB 中的输入
【发布时间】:2017-05-10 01:38:12
【问题描述】:

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

所需代码行为示例:例如,类似以下的命令应运行 preprocess_datainitialise_modeltrain_model em> 脚本。

>> run_experiment('dataset_1_options', '|preprocess_data|initialise_model|train_model|');

而且这个命令应该只运行 train_model 脚本,但也要评估它的性能:

>> run_experiment('dataset_1_options', '|train_model|evaluate_model|');

在上面的例子中“|”用作分隔符来指定要评估的单独函数名称。这些函数使用 dataset_1_options 指定的选项。请不要专注于如何将那部分输入分离成有意义的函数名;我知道如何使用 strsplit

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

问题:鉴于上述所需的行为和约束,任何人都可以帮助如何将来自另一个调用函数的单独函数名称以及选项/参数传递给这些函数吗?主调用函数应如何使用调用期间指定的选项评估作为输入传入的函数名称?

提前谢谢你。

【问题讨论】:

    标签: matlab function parameter-passing user-input


    【解决方案1】:

    您可以将函数传递给 matlab 中的函数。您只需要在传递时使用@ 符号。在您的情况下,它将是脚本中的 run_experiment('dataset_1_options', @train_model) 。您可以将选项保存在单元格数组或其他内容中。 run_experiment 函数只是一个常规函数,

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

    【讨论】:

    • 但我想指定多个函数名称,例如在我的示例中指定的所需代码行为。根据我对定义这些函数的脚本名称的选择,这些将是一个接一个地执行的不同函数名称。
    • 那么你就不能用我上面描述的方法放入多个函数吗?您可以让他们使用 if 语句进行评估。如果传递的参数是一个函数,您可以使用 matlab isa 函数来检测类型。我认为这可能是使用 varargin 的情况。 varargin 可以让您将可变数量的参数作为元胞数组放入。在你的 run_experiment 代码中,你可以有检测函数的 if 语句。
    【解决方案2】:

    您需要做的是创建一个包含您的函数名称的元胞数组和另一个具有以下相应选项的数组

    % Function name array
    fn_array = {@fn_1, @fn_2, ...};
    % Option array
    option_array = {{fn1_opt1, fn2opt2, ...}; {fn2_opt1, fn2_opt2, ...};, ...};
    

    这两个需要传递给您的 run_experiment 函数,该函数将按如下方式评估它们

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      相关资源
      最近更新 更多