[已答复] 求解,代码中的HowMany函数该如何实现?

[复制链接]
ywk112330 发表于 2017-12-19 11:14:38
clear all;
close all;


L=128; % the frame size
NMax=500;
N=50:50:350;



Mento=50;

for m=1:Mento

    for n=1:length(N)

        Tag=randit(N(n),1,L);

        % compute the idle, succesful and collision number
        NumIdle(m,n)=0;
        NumSucc(m,n)=0;
        NumColl(m,n)=0;
        for i=1:L
            Tmp=HowMany(Tag,i-1);
            if Tmp==0
               NumIdle(m,n)=NumIdle(m,n)+1;
            elseif Tmp==1
               NumSucc(m,n)=NumSucc(m,n)+1;
            else
               NumColl(m,n)=NumColl(m,n)+1;
            end
       end

       % estimation only by low bound
       NLBound(m,n)=NumSucc(m,n)+2*NumColl(m,n);

       % estimation only by Schoute
       NSchoute(m,n)=NumSucc(m,n)+2.39*NumColl(m,n);

       % estimation only by computing the idle number
       NIdle(m,n)=log(NumIdle(m,n)/L)/log(1-1/L);

       % estimation by computing MSE of E(c)-c
       NSet=(NumSucc(m,n)+2*NumColl(m,n)):NMax;
       c=[NumIdle(m,n); NumSucc(m,n); NumColl(m,n)];
       cMSE=0;
       for i=1:length(NSet)
           Ec0=L*((1-1/L)^NSet(i));
           Ec1=NSet(i)*((1-1/L)^(NSet(i)-1));
           Eck=L-Ec0-Ec1;
           Ec(:,i)=[Ec0; Ec1; Eck];
           er=Ec(:,i)-c;
           cMSE(i)=mse(er);
       end
       [val,loc]=min(cMSE);
       NVogt(m,n)=NSet(loc);

       % estimation by maximizing the posteriori probability
       p=0;
       NSetSum=1:NMax;
       for i=1:length(NSetSum)
           fac=factorial(L)/(factorial(NumIdle(m,n))*factorial(NumSucc(m,n))*factorial(NumColl(m,n)));
           pIdle=(1-1/L)^(NSetSum(i)*NumIdle(m,n));
           pSuc=((NSetSum(i)/L)*((1-1/L)^(NSetSum(i)-1)))^NumSucc(m,n);
           pColl=(1-(1-1/L)^NSetSum(i)-(NSetSum(i)/L)*((1-1/L)^(NSetSum(i)-1)))^NumColl(m,n);
           p(i)=fac*pIdle*pSuc*pColl;
       end
       [val,loc]=max(p);
       NPost(m,n)=NSetSum(loc);

      % estimation by MMSE
      yMMSE=0;
      for i=1:NMax
            yMMSE(i)=i*p(i);   
      end
      NMMSE(m,n)=sum(yMMSE)/sum(p);

      % estimation by absolute
      Absolute=0;
      for i=1:NMax
          Absolute(i)=abs(sum(p(1:i))-sum(p(i:NMax)));
      end
      [Val,NAbsolute(m,n)]=min(Absolute);



       % relative error
       ErrorNLBoundNomean(m,n)=RelativeError(NLBound(m,n),N(n));
       ErrorNSchouteNomean(m,n)=RelativeError(NSchoute(m,n),N(n));
       ErrorNIdleNomean(m,n)=RelativeError(NIdle(m,n),N(n));
       ErrorNPostNomean(m,n)=RelativeError(NPost(m,n),N(n));
       ErrorNVogtNomean(m,n)=RelativeError(NVogt(m,n),N(n));
       ErrorNMMSENomean(m,n)=RelativeError(NMMSE(m,n),N(n));
       ErrorNAbsoluteNomean(m,n)=RelativeError(NAbsolute(m,n),N(n));


   end

end

% MeanNLBound=mean(NLBound);
% MeanNSchoute=mean(NSchoute);
% MeanNIdle=mean(NIdle);
% MeanNPost=mean(NPost);
% MeanNPostLess=mean(NPostLess);
% MeanNVogt=mean(NVogt);
% MeanNVogtLess=mean(NVogtLess);

ErrorNLBound=mean(ErrorNLBoundNomean)*100;
ErrorNSchoute=mean(ErrorNSchouteNomean)*100;
ErrorNIdle=mean(ErrorNIdleNomean)*100;
ErrorNVogt=mean(ErrorNVogtNomean)*100;
ErrorNMMSE=mean(ErrorNMMSENomean)*100;
ErrorNAbsolute=mean(ErrorNAbsoluteNomean)*100;
ErrorNPost=mean(ErrorNPostNomean)*100;


figure(1);
plot(N, ErrorNLBound,'-k+','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','w','MarkerSize',5);
hold on;
plot(N, ErrorNSchoute,'-k*','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',7);
hold on;
plot(N, ErrorNIdle,'-kv','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','w','MarkerSize',5);
hold on;

plot(N, ErrorNVogt,'-ks','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','w','MarkerSize',5);
   hold on;

plot(N, ErrorNMMSE,'-ko','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','w','MarkerSize',5);
   hold on;
plot(N, ErrorNAbsolute,'-k.','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','w','MarkerSize',5);
  hold on;
plot(N, ErrorNPost,':k','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','w','MarkerSize',7);

hold off;
legend('下限值法','Schoute估计法','空时隙数法','Vogt估计','贝叶斯均方估计','贝叶斯绝对估计','最大后验概率估计',2);  % plot the legend
%  grid; % plot the grid
xlabel('标签数,n'),ylabel('相对误差,ε(%)');


6 条回复


Angla2016 发表于 2017-12-19 11:24:53
如果你有一点常识判断能力就不会问了,这个函数干嘛的,什么原理都不知道,凭什么能够实现出来?也是醉了

ywk112330 发表于 2017-12-19 16:37:50
Angla2016 发表于 2017-12-19 11:24
如果你有一点常识判断能力就不会问了,这个函数干嘛的,什么原理都不知道,凭什么能够实现出来?也是醉了 ...

为了做实验才刚刚开始接触matlab,所以很多都不懂,这个代码也是看到某位大神写的。这个函数的功能是确定标签矩阵和时隙之间的关系,也就是如果一个时隙中有两个或以上的标签,那就是碰撞时隙,要返回一个除0和1以外的值,一个也没有的话就是空闲时隙,返回0。就是不太明白这个函数具体是如何确定tag和L的关系的?

Angla2016 发表于 2017-12-19 16:40:44
ywk112330 发表于 2017-12-19 16:37
为了做实验才刚刚开始接触matlab,所以很多都不懂,这个代码也是看到某位大神写的。这个函数的功能是确定 ...

那么你就问写代码的人,你在这里问别人不可能知道里面到底怎么回事

ywk112330 发表于 2017-12-19 16:53:36
Angla2016 发表于 2017-12-19 16:40
那么你就问写代码的人,你在这里问别人不可能知道里面到底怎么回事

几年前发的,现在已经联系不到那个人了,我也是出于无奈才在这里求解的

Angla2016 发表于 2017-12-19 17:02:42
ywk112330 发表于 2017-12-19 16:53
几年前发的,现在已经联系不到那个人了,我也是出于无奈才在这里求解的 ...

在这里求有什么意义呢?除了显示你的尴尬外并没有任何好处
建议你研究清楚算法,然后按照算法写程序,这是最靠谱的办法

dym1989 发表于 6 天前
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表