我定义了一个函数,它返回符号表达式或函数句柄的衍生物(再加上一些)。
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
答案 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