Matlab导数返回一个常数

Matlab导数返回一个常数,matlab,anonymous-function,derivative,Matlab,Anonymous Function,Derivative,我定义了一个函数,它返回符号表达式或函数句柄的导数(再加上一些) 它工作得很好,但是当我输入一条线时,我得到的东西不会产生数组 >> df = der(@(r) r) df = @(r)1.0 >> df([1,2,3]) ans = 1 是否有任何方法可以捕获输出函数是否为常量,并更改输出,使其行为为 >> df = der(@(r) r) df = @(r)1.0*ones(size(r)) >>

我定义了一个函数,它返回符号表达式或函数句柄的导数(再加上一些)

它工作得很好,但是当我输入一条线时,我得到的东西不会产生数组

>> df = der(@(r) r)

df = 

    @(r)1.0

>> df([1,2,3])

ans =

    1
是否有任何方法可以捕获输出函数是否为常量,并更改输出,使其行为为

>> df = der(@(r) r)

df = 

    @(r)1.0*ones(size(r))

>> df([1,2,3])

ans =

    1 1 1
这里有一个解决方案

function df = der(f)
    if isa(f, 'cfit') || isa(f, 'sfit')
        df = @(x) differentiate(f, x);
    elseif isa(f, 'sym') || isa(f, 'function_handle')
        syms r
        F = sym(f);
        df = matlabFunction(diff(F), 'Vars', r);
    % These next four lines have been added:
        c = df(ones(1,2));             
        if length(c) == 1
            df = @(x) c*ones(size(x));
        end                            
    else
        error('Not a derivative of a known type')
    end
end
评估
df=der(@(r)20*r);df([1,2,3])
现在给出输出

ans =

    20 20 20 

为了解释代码中的错误,
syms r
创建一个标量符号变量。据我所知,没有可靠的解决方案来获得矢量化版本

一个简单的“修复”,分别评估每个值:

>> arrayfun(df,[1,2,3])

ans =

     1     1     1

你好我已经为我们建立了一个MATLAB聊天室,以防您想讨论与MATLAB相关的任何话题,或者如果您想讨论的内容超过一个评论块。有时间的时候过来看看!
>> arrayfun(df,[1,2,3])

ans =

     1     1     1