matlab中的符号差异应返回向量

时间:2015-11-20 15:55:03

标签: matlab

如果我在MATLAB中有一个符号函数p(r,s) = r^3,我会得到导数dp/dr = 3r^2dp/ds = 0,但我的目标是使用matlabFunction将这些表达式转换为函数句柄,带矢量输入(r,s)。对于导数zeros(size(s)),我想要类似于dp/ds的内容,因此如果我的输入(r,s)是向量,则不会获得标量输出。

我试过这段代码:

syms r s 
p = r^3
dpds = diff(p,s)

给出标量零而不是可变大小为零,即如果我们有向量输入则为标量输出。

1 个答案:

答案 0 :(得分:1)

这是matlabFunction的工作原理。如果你提供一个没有独立变量的等式作为等式的一部分,它将默认为你提供一个没有输入的匿名函数,并给你一个标量结果。

例如:

>> syms r s;
>> p = r^3;
>> dpds = diff(p,s);
>> dpdsFunc = matlabFunction(dpds)

dpdsFunc = 

    @()0.0

每次只会给你一个标量值。这也适用于任何给出非零输出的标量函数。如果您希望覆盖此行为并提供此标量的可变长度(取决于输入的长度),则可以通过检查函数的数量来检测函数中是否存在任何输入变量。您可以使用symvar。您将检查此数组的长度是否为0,如果是,则覆盖该函数。

想到这样的事情:

syms r s;
p = r^3;
dpds = diff(p,s);

if numel(symvar(dpds)) == 0
    dpdsFunc = @(s) ones(size(s))*double(dpds); %// Thanks Daniel!
else
    dpdsFunc = matlabFunction(dpds);
end

这应该达到你想要的效果。

次要注意事项

我实际上认为这个可变长度的零业务是默认情况下应放入MATLAB,而不是默认为单个值。它使矢量化代码更容易。我很想在将来向MathWorks提交功能请求。