我试图通过插入数值来评估符号向量函数。初始化符号向量后,我得到值XX1,XX2,XX3等...但是,当我尝试插入数字向量时,我得到错误:未定义的函数或变量。任何帮助,将不胜感激。谢谢!
syms yy
XX = sym('XX', [1 3]);
ww = sym('ww', [1 3]);
f = log(0.5)+log(1+((2*yy-1)*dot(XX,ww))/sqrt(1+dot(XX,ww)^2));
gf = gradient(f,ww);
hf = hessian(f,ww);
%create numeric vectors
X = rand(3,1);
w = rand(3,1);
y = 1;
for (m = 1:length(w))
XX(m) = X(1,m);
ww(m) = w(m);
end
yy = y;
eval(gf);
eval(hf);
答案 0 :(得分:1)
使用matlabFunction
将符号函数转换为数值函数
syms yy
XX = sym('XX', [1 3]);
ww = sym('ww', [1 3]);
f = log(0.5)+log(1+((2*yy-1)*dot(XX,ww))/sqrt(1+dot(XX,ww)^2));
gf = gradient(f,ww);
hf = hessian(f,ww);
%create numeric vectors
X = rand(1,3); %// Note your XX and ww were 1x3 so X and w should be as well
w = rand(1,3);
y = 1;
hfNumerical=matlabFunction(hf,'Vars',{XX,ww,yy})
hfNumerical(X,w,y)
gfNumerical=matlabFunction(gf,'Vars',{XX,ww,yy})
gfNumerical(X,w,y)
您必须指定这样的变量,以便它们保持为矢量/矩阵输入。
答案 1 :(得分:1)
错误源于这样一个事实:当您为符号变量XX
和ww
分配值时,您不会为它们所持有的符号变量赋值。
例如,变量XX
初始值为
XX =
[ XX1, XX2, XX3]
在rand(1,3)
分配后,它会将符号组件替换为数字
XX =
0.7317 0.6477 0.4509
但XX1
,XX2
和XX3
的值仍然未定义。您可以逐个定义这些值并使用eval
但不要。
你应该像@David建议的那样做,并从输出中创建一个MATLAB函数句柄,或者如果你只需要这样做就使用subs
:
X = rand(1,3);
w = rand(1,3);
y = 1;
value = subs(gf,[XX,ww,yy],[X,w,y]);