如何使用向量而不是参数列表调用函数句柄?

How do I call a function handle with an vector rather than a list of arguments?

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

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

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)

我收到一个错误:

Not enough input arguments.

这是有道理的,因为它需要 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)

在此先感谢您的帮助。

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

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

关于varargin, the general idea was already presented in 。我只是想解决您的具体情况。

看来,您希望对具有不同参数的 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 调用将 return 函数句柄的元胞数组。同样,输出显示了可比较的结果:

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

希望对您有所帮助!