回 帖 发 新 帖 刷新版面

主题:求助一个matlab编程问题,请大家帮帮我

我在一篇英文文献中找到的如下matlab程序,怎么每次运行时都有错误啊,我没学过matlab,自己看了点,也是皮毛。希望高手们帮我指点一下。
function [lambda,p,entr]=me_dens1(mu,x,lambda0)
mu=mu(:);mu=[1;mu];
x=x(:);lx=length(x);
xmin=x(1);xmax=x(lx);dx=x(2)-x(1);
if(nargin==2)
  lambda=zeros(mu);运行时,这个地方它提示出错,说zeros函数需要一个整数的行向量
  lambda(1)=log(xmax-xmin);
else
  lambda=lambda0(:);
end
N=length(lambda);
fin=fin1_x(x);
iter=0;
while 1
  iter=iter+1;
  disp('---------------------');disp(['iter=',num2str(iter)]);
  p=exp(-(fin*lambda));
  plot(x,p);
  G=zeros(N,1);
  for n=1:N
    G(n)=dx*sum(fin(:,n).*p);
  end
  entr(iter)=lambda'*G(1:N);
  disp(['entropy=',num2str(entr(iter))])
  gnk=zeros(N,N);
  gnk(1,:)=-G';gnk(:,1)=-G;
  for i=2:N
    for j=2:i
        gnk(i,j)=-dx*sum(fin(:,j).*fin(:,i).*p);
    end
  end
  for i=2:N
    for j=i+1:N
        gnk(i,j)=gnk(j,i);
    end
  end
  v=mu-G;
  delta=gnk\v;
  lambda=lambda+delta;
  eps=1e-6;
  if(abs(delta./lambda)<eps),   break,end
  if(iter>2)
    if(abs((entr(iter)-entr(iter-1))/entr(iter))<eps),break,end
  end
end
p=exp(-(fin*lambda));
plot(x,p);
entr=entr(:);
disp('------------END-------------')
end
this program calculates the lagrange multipliers of the Max entropy probability density functions p(x) from the knowledge of the N constraints in the form:
E(fin(x))=mu(n) 
n=0:N with fi0(x)=1,mu(0)=1.
mu is a table containing the constraints mu(n),n=1:N
X is a table defining the range of variation of x
LAMBDA0 is a table containing the first estimate of the LAMBDAs
LAMBDA is a table containing the resulting lagrange parameters.
p is a table containing the resulting pdf p(x)
entr is a table containing the entropy values at each iteration.
我要输入的运行指令如下:
xmin=0.0001;xmax=1;dx=0.01;
x=[xmin:dx:xmax]'';
mu=[0.3,-1.5]';
[lambda,p,entr]=me_dens1(mu,x);运行到这时出错,提示是:??? Error using ==> zeros
Size vector must be a row vector with integer elements.

Error in ==> me_dens1 at 6
  lambda=zeros(mu);
是我操作有误吗,还是什么啊,请各位大虾指点。
接着的指令如下,有兴趣的朋友可以帮我运行一下。
alpha=-lambda(3);beta=lamnda(2);
m=(1+alpha)/beta;sigma=m/beta;
disp([mu' alpha beta m sigma entr(length(entr))]

回复列表 (共8个回复)

沙发

函数学过吧
你看你的输入参数
mu=[0.3,-1.5]';
显然mu 是小数
而主程序中要通过mu生成零矩阵(lambda=zeros(mu);)
一个矩阵的高和宽可能是小数吗?

多help 一下吧

板凳

怎么改一改阿,这外国人写的文章里给出的程序,怎么这么不靠谱啊,帮帮我啊,大虾

3 楼

也许 你不是学理工科的
呵呵 
描述一个矩阵我们通常说它是M × N 矩阵,就是说这个矩阵有M行N列。M,N必须是正整数  而 lambda=zeros(mu); 就是要产生一个全零的矩阵,表示矩阵大小的两个数存在mu里,所以mu包含的应该是两个整数元素,因此你输入的mu不应该包含有小数

4 楼

[quote]也许 你不是学理工科的
呵呵 
描述一个矩阵我们通常说它是M × N 矩阵,就是说这个矩阵有M行N列。M,N必须是正整数  而 lambda=zeros(mu); 就是要产生一个全零的矩阵,表示矩阵大小的两个数存在mu里,所以mu包含的应该是两个整数元素,因此你输入的mu不应该包含有小数[/quote]
 这个我晓得了,问题不在于我输入的mu,因为mu是最大熵中那个期望值,可以是任意实数,可能是lambda=zeros(mu); 这个出了问题吧,我把它改成lambda=zeros(length(mu)); 可是后面运行时,还是有错误,这是一个法国人写的文章中带的程序和运行程序的例子,我只是照着他的程序是这运行而已,不过总是有错。我只是想求出最大熵的那几个参数就可以了,不知各位有什么高见,或者有其他求解最大熵分布函数的软件介绍给小弟也可以,感激不尽。我是学经济统计的,matlab没学过。

5 楼

兄弟 看看这段话

this program calculates the lagrange multipliers of the Max entropy probability density functions p(x) from the knowledge of the N constraints in the form:
E(fin(x))=mu(n) 
n=0:N with fi0(x)=1,mu(0)=1.
mu is a table containing the constraints mu(n),n=1:N


这分明说mu里边包含的就应该是一个整数N,而且你用length(mu)替代mu能运行也证明了这一点,因为length(mu)=2,得出的就是整数

我再想确认一下
mu=mu(:);mu=[1;mu];
这一句你有没有写错

还有就是 fin=fin1_x(x);
函数你没有提供,我运行不了
愿意交流的话,请提供一下

6 楼

[quote]兄弟 看看这段话

this program calculates the lagrange multipliers of the Max entropy probability density functions p(x) from the knowledge of the N constraints in the form:
E(fin(x))=mu(n) 
n=0:N with fi0(x)=1,mu(0)=1.
mu is a table containing the constraints mu(n),n=1:N


这分明说mu里边包含的就应该是一个整数N,而且你用length(mu)替代mu能运行也证明了这一点,因为length(mu)=2,得出的就是整数

我再想确认一下
mu=mu(:);mu=[1;mu];
这一句你有没有写错

还有就是 fin=fin1_x(x);
函数你没有提供,我运行不了
愿意交流的话,请提供一下
[/quote]
function fin=fin1_x(x);
M=3;
fin=zeros(length(x),M);
fin(:,1)=ones(x);
fin(:,2)=x;
fin(:,3)=log(x);
end
这是fin函数,我感觉这里面也有错误。你把信箱留下来,我把原文留给你吧。

7 楼

93634533@qq.com

8 楼


function [lambda,p,entr]=me_dens1(mu,x,lambda0)
mu=mu(:);mu=[1;mu];
x=x(:);lx=length(x);
xmin=x(1);xmax=x(lx);dx=x(2)-x(1);
if(nargin==2)
    NN=length(mu);
  lambda=zeros([i]size(mu)[/i]);   %运行时,这个地方它提示出错,说zeros函数需要一个整数的行向量
  lambda(1)=log(xmax-xmin);
else
  lambda=lambda0(:);
end
N=length(lambda);
fin=fin1_x(x);
iter=0;
while 1
  iter=iter+1;
  disp('---------------------');disp(['iter=',num2str(iter)]);
  p=exp(-(fin*lambda));
  plot(x,p);
  hold on
  G=zeros(N,1);
    for n=1:N
        G(n)=dx*sum(fin(:,n).*p);
  end
  yyy=lambda'*G(1:N)
  entr(iter)=lambda'*G(1:N);
  disp(['entropy=',num2str(entr(iter))])
  gnk=zeros(N,N);
  gnk(1,:)=-G';gnk(:,1)=-G;
  for i=2:N
    for j=2:i
        gnk(i,j)=-dx*sum(fin(:,j).*fin(:,i).*p);
    end
  end
  for i=2:N
    for j=i+1:N
        gnk(i,j)=gnk(j,i);
    end
  end
  v=mu-G;
  delta=gnk\v;
  lambda=lambda+delta;
  eps=1e-6;
  if(abs(delta./lambda)<eps),   break,end
  if(iter>2)
    if(abs((entr(iter)-entr(iter-1))/entr(iter))<eps),break,end
  end
end
p=exp(-(fin*lambda));
plot(x,p);
entr=entr(:);
disp('------------END-------------')
% end

alpha=-lambda(3);beta=lambda(2);
m=(1+alpha)/beta;sigma=m/beta;
disp([mu' alpha beta m sigma entr(length(entr))])



输入测试代码:
mu=[0.2,-3.0]';
xmin=0.0001;xmax=1;dx=0.01;
x=[xmin:dx:xmax]';
[lambda,p,entr]=me_dens1(mu,x);
即可以得到结果:
  1.0000    0.2000   -3.0000   -0.2156    3.0962    0.2533    0.0818   -0.6713

和那篇文章里给得结果一致。


代码中斜体写的就是更改的部分

我来回复

您尚未登录,请登录后再回复。点此登录或注册