如何在matlab中分离if和else

时间:2013-11-15 17:23:27

标签: matlab entropy

让我们考虑以下代码

function averageentropy=calculate(f,y)
count1=0;
count0=0;
n=length(f);
n1=0;
n0=0;
 entrop1=0;
  entrop2=0;
bigp=sum(f)/n;
for i=1:n 
     if f(i)==1 && y(i)==1
         count1=count1+1;
     end
end
 for i=1:n
     if  f(i)==0 && y(i)==1
          count0=count0+1;
     end
 end
for i=1:n
     if f(i)==1
          n1=n1+1;
     end
end
 for i=1:n 
     if f(i)==0
         n0=n0+1;
     end
 end
 smallpplus=count1/n1;
 smallpminus=count0/n0;
 if smallpplus==0
     entrop1=0;
 else
 entrop1=-smallpplus*log2(smallpplus)-(1- smallpplus)*log2(1- smallpplus);
end
  if smallpminus==0
     entrop2=0;
  else
  entrop2=-smallpminus*log2(smallpminus)-(1- smallpminus)*log2(1- smallpminus);

 end 
  averageentropy=bigp*entrop1+(1-bigp)*entrop2
end

当我运行此代码时,我得到0.4056,而在Excel中,相同的过程返回大约0.91,这意味着在if和else情况下有一些错误,因为如果我删除if和else,我得到同样的答案,那么问题是什么?我正在使用if和else来避免log(0),但是有一些问题。

1 个答案:

答案 0 :(得分:0)

如果f,y是实值而不是整数,我建议使用例如

  

abs(f(i)-1)< = eps

其中eps是'小数字'(例如eps = 1e-5) 而不是

  

F(1)== 1

在旁注中,您可以编写代码的这一部分:

for i=1:n 
     if f(i)==1 && y(i)==1
         count1=count1+1;
     end
end
 for i=1:n
     if  f(i)==0 && y(i)==1
          count0=count0+1;
     end
 end
for i=1:n
     if f(i)==1
          n1=n1+1;
     end
end
 for i=1:n 
     if f(i)==0
         n0=n0+1;
     end
 end

利用Matlab的矢量化表达能力,更加紧凑和高效(为了便于阅读,我更倾向于牺牲一些额外的行):

indf1 = f == 1;
indf0 = ~indf1 ;
indy1 = y == 1;
indy0 = ~indy1 ;
count1 = sum(indf1 & indy1) ;
count0 = sum(indf0 & indy1) ;
n1 = sum(indf1);
n0 = sum(indf0);