【发布时间】:2013-11-18 03:13:38
【问题描述】:
这个问题最初可能看起来类似于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 循环来为evalPoints 的每一行评估derivFun,但我想尽可能避免使用这样的循环。
感谢您的时间和考虑。
【问题讨论】:
-
我不知道为什么我之前没有想到这个:使用
symvar。if isempty(symvar(derivSym))然后derivFun = @(q) double(derivSym)*ones(size(q));。还有其他想法吗?