繁体   English   中英

恒定匿名函数(先验未知的匿名函数)的输出数量

[英]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定,然后仍然使derivValsevalPoints大小相同。

我知道我可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM