这个问题最初可能与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]。
也就是说,即使输入函数恰好是线性(或常量),我也希望derivVals
与evalPoints
的大小相同。我提前不知道输入表达式是什么。
任何人都可以为一个可以做到这一点的计划提出建议吗?我知道恒定的匿名函数只会返回一个常量标量,无论其输入的大小如何。我希望的可能是某种方式来识别匿名函数何时不变,然后仍然使derivVals
与evalPoints
的大小相同。
我知道我可以使用for
循环为derivFun
的每一行评估evalPoints
,但如果可能的话,我想避免使用这样的循环。
感谢您的时间和考虑。
答案 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
更好。)