[英]Number of outputs from constant anonymous function (anonymous function not known a priori)
这个问题最初看起来可能与此其他问题相似,但我的情况有所不同。
我有一个函数'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
定,然后仍然使derivVals
与evalPoints
大小相同。
我知道我可以使用for
循环来评估derivFun
的每一行的evalPoints
,但是我想尽可能避免使用这样的循环。
感谢您的时间和考虑。
不是100%确定我正确地得到了问题。 这样可以解决您的问题吗?:
if isscalar(derivVals)
derivVals = repmat(derivVals, size(evalPoints));
end
我认为这是一个稍微简单的解决方案。 问题是您使用的是matlabFunction
,它简化了方程式,并且不允许太多自定义。 但是,您可以创建匿名函数的匿名函数。 只需在您的matlabFunction
行之后添加matlabFunction
行:
derivFun = @(evalPoints)derivFun(evalPoints)+zeros(size(evalPoints));
这只会对原始derivFun
一次评估。 但是,我确实喜欢您的symvar
解决方案(请记住,添加zeros
始终比乘以ones
更好)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.