【问题标题】:How do I call a function handle with an vector rather than a list of arguments?如何使用向量而不是参数列表调用函数句柄?
【发布时间】:2020-03-16 04:15:18
【问题描述】:

我想知道如何使用输入向量而不是参数列表调用函数句柄。

所以,如果我有一个定义的函数句柄:(我想很明显我正在这里拟合函数)

fitFunctionHandle = @(a1, wG1, x1,a2, wG2, x2, c, x)(FitGaussianFn(x, [a1, 0, wG1, x1]) +FitGaussianFn(x, [a2, 0, wG2, x2]) + c

我有一个输入向量要交给它

a1Init = 1
wG1Init = 2
x1Init = 3
a2Init = 4
wG2Init = 5
x2Init = 6
a2Init = 7
x = 8
%startPoint = [a1Init, wG1, x1,a2, wG2, x2, c]
inputArray = [a1Init, wG1, x1,a2, wG2, x2, c, x]

如何以向量 startPoint 作为输入来调用它。如果我尝试(例如)

>> fitFunctionHandle(inputArray)

我收到一个错误:

输入参数不足。

这是有道理的,因为它需要 8 个输入而不是 8 个元素的向量 - 但我想知道是否有这样的调用方式。我认为例如在 python 中,您可以将数组转换为列表或其他内容。

我知道在这个例子中我可以简化一些事情,我有一个已知输入的列表,所以我可以这样做:

fitFunctionHandle(a1Init, wG1, x1,a2, wG2, x2, c, x) 

fitFunctionHandle(inputArray(1),inputArray(2),inputArray(3,inputArray(4), inputArray(5), inputArray(6),inputArray(7),inputArray(8)) 

但是!我想我试图允许在我不知道会有多少争论的地方进行扩展。 对于奖励积分(再次因为我正在研究拟合函数) - 当 x 也是向量时知道如何调用它会很酷。我怀疑我会做类似的事情

arrayfunc(fitFunctionHandle([startPoint,x]), xVector)

提前感谢您的帮助。

【问题讨论】:

    标签: matlab function function-handle


    【解决方案1】:

    关于varargin,大致思路已经在UnbearableLightness' answer中提出。我只是想谈谈你的具体情况。

    看来,您希望对带有不同参数的FitGaussianFn 调用进行一些动态线性组合,从而产生一些复杂的函数句柄。对于可变数量的术语,我建议编写一个单独的函数来生成最终的函数句柄。我做了一个小玩具的例子。

    这是我的fitFunctionHandle.m 函数:

    function h = fitFunctionHandle(varargin)
    
      n = numel(varargin);
    
      if (n < 2)
        error('Not enough input arguments.');
      end
    
      % Last input argument is considered t
      t = varargin{end};
    
      h = @(x) 0;
      for iArg = 1:n-1
        a = varargin{iArg}(1);
        b = varargin{iArg}(2);
        h = @(x) h(x) + (a*sin(b*x+t)); 
      end
    
    end
    

    每个输入参数由两个参数组成,形成一个sin 术语。最后总是传递一个额外的移位参数t

    还有,这里有一些测试脚本:

    % Set up parameters
    a1 = 1; b1 = 1;
    a2 = 2; b2 = 2;
    a3 = 3; b3 = 3;
    t = pi/16;
    
    % Evaluation point
    x = pi/4;
    
    % Compare results with explicit function calls
    h = fitFunctionHandle([a1, b1], t);
    res = h(x)
    cmp = sin(x+t)
    
    h = fitFunctionHandle([a1, b1], [a2, b2], t);
    res = h(x)
    cmp = sin(x+t) + 2*sin(2*x+t)
    
    h = fitFunctionHandle([a1, b1], [a2, b2], [a3, b3], t);
    res = h(x)
    cmp = sin(x+t) + 2*sin(2*x+t) + 3*sin(3*x+t)
    

    你看,传递多少个参数向量并不重要。

    输出显示,传递的函数句柄是正确的:

    res =  0.83147
    cmp =  0.83147
    res =  2.7930
    cmp =  2.7930
    res =  4.4598
    cmp =  4.4598
    

    关于你的最后一个问题,让我们看看这个测试:

    % Set up array of t parameters, and get set of function handles
    t = [pi/16, pi/8, pi/4];
    hh = arrayfun(@(x) fitFunctionHandle([a1, b1], x), t, 'UniformOutput', false);
    
    % Compare results with explicit function calls
    for iH = 1:numel(hh)
      h = hh{iH};
      res = h(x)
      cmp = sin(x + t(iH))
    end
    

    这里,用于fitFunctionHanle 中所有sin 术语的t 是一个向量。 arrayfun 调用将返回一个函数句柄元胞数组。同样,输出显示了可比较的结果:

    res =  0.83147
    cmp =  0.83147
    res =  0.92388
    cmp =  0.92388
    res =  1
    cmp =  1
    

    希望有帮助!

    【讨论】:

      【解决方案2】:

      如果我理解正确,您正在寻找一种将可变数量的输入参数传递给匿名函数的方法。 看看这个例子:

      anonymousFunction = @(varargin)(image(varargin{:}));
      
      x = [5 8];
      y = [3 6];
      C = [0 2 4 6; 8 10 12 14; 16 18 20 22];
      
      input = {C};
      anonymousFunction(input{:});
      
      input = {x,y,C};
      anonymousFunction(input{:});
      

      您可以在示例中看到可变数量的输入用于调用匿名函数。当然,这取决于使用参数的实际函数(在本例中为image

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        相关资源
        最近更新 更多