Matlab派生返回常量

时间:2015-06-30 19:57:01

标签: matlab anonymous-function derivative

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

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);
    else
        error('Not a derivative of a known type')
    end
end

它运作良好但是当我输入一行时,我得到一些不产生数组的东西。

>> 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

2 个答案:

答案 0 :(得分:2)

这是一个解决方案。

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 

答案 1 :(得分:1)

要解释代码中的错误,public class KryoEncoder extends MessageToByteEncoder<Object> { private final Kryo kryo; public KryoEncoder(Kryo kryo) { this.kryo = kryo; } @Override protected void encode(ChannelHandlerContext ctx, Object in, ByteBuf out) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); Output output = new Output(outStream, 4096); kryo.writeClassAndObject(output, in); output.flush(); byte[] outArray = outStream.toByteArray(); out.writeShort(outArray.length); out.writeBytes(outArray); } } 会创建一个标量符号变量。据我所知,没有可靠的解决方案来获得矢量化版本。

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

syms r