什么是matlabFunction的一个很好的替代品?

时间:2014-09-28 14:15:46

标签: matlab symbolic-math numerical-integration game-theory

我在MATLAB中编写了一个小程序来计算Shapley值 使用TU游戏的多线性扩展。但是,我跑了 使用MATLAB的Symbolic Math Toolbox陷入困境。在 程序我必须集成一组函数来获得 Shapley值。但是,在MATLAB程序中我无法使用 int()命令

Error using sym/subsindex (line 663) Ivalid indexing or function definition. When defining a function, ensure that the body of the function is a SYM object. When indexing, the input must be numeric, logical or ':'.

Error in ShapleyValueML (line 65)shv(jj)=int(dfy,0,1) 

因此我必须使用integral()代替。在这种情况下,我 需要将表达式转录成MATLAB函数句柄 用matlabFunction()。但是,在所有Linux机器(MATLAB R2014a)上 我有权访问此命令不起作用(请参阅下面的讨论)。 作为解决方法,MATLAB程序返回一组函数 在当前工作空间中,可以计算Shapley值 使用int()命令。

为了使讨论更具体,让我们考虑一下这个问题 首先是MATLAB程序。

function [shv,F,dfm]=ShapleyValueML(v)

N=length(v);
[~, n]=log2(N);
S=1:N;
int=0:-1:1-n; 
mat=(rem(floor(S(:)*pow2(int)),2)==1);
cmat=(rem(floor(S(:)*pow2(int)),2)==0);
x=sym('x',[1 n]);
mx=1-x;
y = sym('y');
vy=ones(1,n)*y;
F=0;
shv=zeros(1,n);
dfm=cell(1,n);

for ss=1:N
    pd1=x(mat(ss,:));
    pd2=mx(cmat(ss,:));
    pd=prod(pd1)*prod(pd2)*v(ss);
    F=pd+F;
end
F=expand(F);

 for jj=1:n
     dF=diff(F,x(jj));
     dfy=subs(dF,x,vy);
%% Does not work!! MATLAB bug??? 
%  mf=matlabFunction(dfy);
%  shv(jj)=integral(mf,0,1);
%%
%% The best would be to use:
%%
%   shv(jj)=int(dfy,0,1)
%% but it cannot be used inside a program.
 dfm{jj}=dfy;
 end

end

评论的部分是不能在里面工作的部分 程序,但需要计算Shapley值 与该计划,这是它的目的。我测试了这个程序 最多12名球员,我能够成功计算出来 Shapley值通过两步程序。因此,上述计划 正确指出所考虑的问题。为了更好 理解这两步程序和功能 在上述节目中,让我们专注于三人游戏。 联盟的值由以下数据数组

给出
>> v = [0,0,90,0,100,120,220];

请注意,联盟是按照其独特的方式订购的 整数表示。游戏已定义,我们现在可以评估 多线性扩展和一组偏导数 以上程序,但不是Shapley值。

>> [shv,F,dfm]=ShapleyValueML(v);

该组偏导数的积分在对角线上运行 单位立方体,但我们可以设置[x1,x2,x3]的变量 到[y,y,y],积分从0到1运行。

>> for k=1:3, shv(k)=int(dfm{k},0,1);end;

整合的解决方案是Shapley值,由下式给出:

>> shv

shv =

    65    75    80

检查这确实是Shapley值可以完成

中实施的潜在功能方法
>> sh_v=ShapleyValue(v)

sh_v =

     65    75    80

附带我的MATLAB Game Theory Toolbox MatTuGames来自

http://www.mathworks.com/matlabcentral/fileexchange/35933-mattugames

不是与int()集成,也可以使用integral(), 但接下来的内容如

>> dfm{1}

ans =

    - 90*y^2 + 190*y

必须用matlabFunction()重写成函数句柄。就像我一样 如上所述,这在Linux下不起作用 (MATLAB R2013a,R2013b,R2014a)。要看到这一点,让我们尝试重现 例子

>> syms x y
>> r = sqrt(x^2 + y^2);

来自网址上的文档:

http://www.mathworks.de/de/help/symbolic/generate-matlab-functions.html?searchHighlight=matlabFunction

这应该给出

ht = 
@(x,y)tanh(sqrt(x.^2+y.^2))

但我得到

>> ht = matlabFunction(tanh(r))
   Cell contents reference from a non-cell array object.

   Error in vectorize (line 15)
    c = cells{i};

   Error in sym/matlabFunction>mup2mat (line 319)
   res = vectorize(res(2:end-1)); % remove quotes

   Error in sym/matlabFunction>mup2matcell (line 304)
    r = mup2mat(c{1});

   Error in sym/matlabFunction (line 123)
   body = mup2matcell(funs);

现在我的问题出现了:存在一个替代程序 来自

>> dfm{1}

ans =

  - 90*y^2 + 190*y

一个函数句柄

>> df=@(y) (- 90.*y.^2 + 190.*y)

 df = 

    @(y)(-90.*y.^2+190.*y)

通过

整合它
>> integral(df,0,1)

ans =

   65

或者换句话说。有没有替代方法可用 将乘法*改为逐元素乘法。*,和 动力操作^以元素为动力。^?

当然,对上述MATLAB程序有任何改进建议 非常感谢。


1 个答案:

答案 0 :(得分:2)

我想我知道问题是什么;在ShapleyValueML函数的开头,您有一个名为int的变量,它隐藏内置integration function

...

int=0:-1:1-n;    %# <-- problem!

...

shv(jj)=int(dfy,0,1)

...

这解释了来自sym/subsindex的错误,您使用符号对象作为数值数组int的索引。

将变量名称更改为其他名称,并且注释的代码运行正常(符号集成)!很简单:)