如何使用向量而不是参数列表调用函数句柄?
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
希望对您有所帮助!
我想知道如何使用输入向量而不是参数列表来调用函数句柄。
所以如果我有一个定义的函数句柄:(我想很明显我正在这里处理拟合函数)
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
希望对您有所帮助!