常量匿名函数的输出数(匿名函数不是先验的)

时间:2013-11-18 03:13:38

标签: matlab anonymous-function

这个问题最初可能与this other question类似,但我的情况有点不同。

我有一个函数'deriv',它以符号表达式作为输入,然后获取该符号表达式的一阶导数。然后使用matlabFunction()将该导数转换为匿名函数,然后在点数组上进行求值。我稍后也会在其他一些代码中使用匿名函数。

我遇到的问题是有时输入符号表达式恰好是线性的,因此导数是常数;因此匿名函数也是常量。当我在点数组上评估匿名函数时,我只得到一个输出而不是输出数组。

这里有一些代码显示了我正在做的事情。为了简单起见,我们假设符号输入表达式只涉及一个名为q的符号变量。

function[derivFun,derivVals] = deriv(input)
derivSym = diff(input,q);
derivFun = matlabFunction(derivSym,'vars',q);
evalPoints = [1;2;3;4;5]; %in my true application, a much larger array
derivVals = derivFun(evalPoints);
end

因此,如果输入为q^2,则输出derivVals将为[2; 4; 6; 8; 10]。但是如果输入恰好是3*q,那么derivVals将是3(只是一个标量)。我想要的是derivVals为[3; 3; 3; 3; 3]。 也就是说,即使输入函数恰好是线性(或常量),我也希望derivValsevalPoints的大小相同。我提前不知道输入表达式是什么。

任何人都可以为一个可以做到这一点的计划提出建议吗?我知道恒定的匿名函数只会返回一个常量标量,无论其输入的大小如何。我希望的可能是某种方式来识别匿名函数何时不变,然后仍然使derivValsevalPoints的大小相同。

我知道我可以使用for循环为derivFun的每一行评估evalPoints,但如果可能的话,我想避免使用这样的循环。

感谢您的时间和考虑。

2 个答案:

答案 0 :(得分:0)

不是100%确定我正确地解决了问题。 这会解决您的问题吗?:

if isscalar(derivVals)
    derivVals = repmat(derivVals, size(evalPoints));
end

答案 1 :(得分:0)

我认为这是一个稍微简单的解决方案。问题是您正在使用matlabFunction,这简化了方程式,并且不允许进行太多自定义。但是,您可以创建匿名函数的匿名函数。只需在matlabFunction行之后添加此行:

derivFun = @(evalPoints)derivFun(evalPoints)+zeros(size(evalPoints));

这只评估原始derivFun一次。但是,我确实喜欢你symvar解决方案(请记住,添加zeros总是比乘以ones更好。)