我试图使用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返回一个函数句柄数组。 ..我已经尝试过这样做了,它应该可行。也许这不是唯一的要求。
以下是一些产生此错误的代码:
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
function equ = charEqu(a)
%CHAREQU create a KP model characteristic equation with provided p
equ = @(x) x + a;
end
function sFunc = makeSolveFunc(start, stop)
%MAKESOLVEFUNC return a function that solves an equation
sFunc = @(func) solve(func, start, stop);
end
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()
使用函数并使用先前提供的初始猜测范围来解决它。
也许我已经习惯了函数式编程,应该只使用一个循环。
答案 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);