首先输入必须是使用arrayfun()的函数句柄错误

时间:2013-12-08 19:28:25

标签: matlab

我试图使用arrayfun()在单元格数组上映射函数。发生以下情况:

>> arrayfun(solveFunc, equArray)
Error using arrayfun
First input must be a function handle.

Error in solve>genGuess (line 33)
funcVals = abs(arrayfun(inFunc, xValues));

Error in solve (line 8)
        x = genGuess(inFunc, varargin{1}, varargin{2});

Error in makeSolveFunc>@(func)solve(func,start,stop) (line 3)
sFunc = @(func) solve(func, start, stop);

但是,第一个输入是一个函数句柄。另外......如果我手动将函数应用于提供的单元格数组的每个元素,一切正常:

>> solveFunc(equArray{1})
ans =
    4.7335
>> solveFunc(equArray{2})
ans =
    4.7356

有谁知道为什么会发生这种情况?我假设如果我可以手动将函数应用于我的数组的每个元素,并且函数的返回类型是一致的并且是允许的类型之一(例如,你可以使用arrayfun返回一个函数句柄数组。 ..我已经尝试过这样做了,它应该可行。也许这不是唯一的要求。

以下是一些产生此错误的代码:

solve.m

function solution = solve(inFunc, start, stop)
%SOLVE solve an equation using Newton's Method

x = genGuess(inFunc, start, stop);

for i = 1:100
    m = getSlope(inFunc, x);
    x = (m*x - inFunc(x))/m;
end

solution = x;
end

function slope = getSlope(inFunc, x)
%SLOPE calculate the slope at a given point
inc = 1e-5;
if x ~= 0
    inc = inc * x;
end

slope = (inFunc(x + inc) - inFunc(x - inc))/(2*inc);
end

function guess = genGuess(inFunc, start, stop)
%GENGUESS get an initial guess to the solution
xValues = linspace(start, stop, 101);
funcVals = abs(arrayfun(inFunc, xValues));
[~, minIndex] = min(funcVals);
guess = xValues(minIndex);
end

charEqu.m

function equ = charEqu(a)
%CHAREQU create a KP model characteristic equation with provided p
equ = @(x) x + a;
end

makeSolveFunc.m

function sFunc = makeSolveFunc(start, stop)
%MAKESOLVEFUNC return a function that solves an equation
sFunc = @(func) solve(func, start, stop);
end

test.m

pArray = 1:5;
equArray = cell(1,arrayLen);
for i = 1:5
    equArray{i} = charEqu(pArray(i));
end
solveFunc = makeSolveFunc(1.1*pi, 2*pi);
alphaAArray = arrayfun(solveFunc, equArray);

我已将错误缩小到genGuess()中的某些内容。出于某种原因,在行funcVals = abs(arrayfun(inFunc, xValues));中,变量inFunc是包含函数句柄的1x1单元数组。我不知道为什么会这样。我将其追溯到@(func) solve(func, start, stop);函数中的匿名函数调用makeSolveFunc()。它仍然是一个包含函数句柄的1x1单元数组。我不确定该单元格的来源,因为该函数是从arrayfun()调用的。

有关我想尝试做什么的背景信息,以防有人想要提出更好的方法: 我试图用牛顿法求解方程。我写了一个函数,可以解决给定初始猜测范围的方程。此函数是您在第一条错误消息中可以看到的solve()函数。它需要一个函数和猜测范围,并返回一个我正在调用solveFunc()的函数。 solveFunc()使用函数并使用先前提供的初始猜测范围来解决它。

也许我已经习惯了函数式编程,应该只使用一个循环。

2 个答案:

答案 0 :(得分:2)

如果传递给函数句柄的参数是单元格数组元素的内容,则需要使用cellfun而不是arrayfun

  cellfun(solveFunc, equArray)

这相当于

for i=1:length(equArray)
    out(i) = solveFunc(equArray{i});
end

因为solveFunc已经是一个函数句柄。

答案 1 :(得分:1)

检查错误的来源。此行导致错误:

funcVals = abs(arrayfun(inFunc, xValues));

第一个输入参数是包含一个函数句柄的1x1单元格。这是因为equArray是一个单元格,因此使用cellfun作为Jonas已经提到的:

pArray = 1:5;
equArray = cell(1,arrayLen);
for i = 1:5
    equArray{i} = charEqu(pArray(i));
end
solveFunc = makeSolveFunc(1.1*pi, 2*pi);
alphaAArray = cellfun(solveFunc, equArray);