2013-11-15 6 views
0

давайте рассмотрим следующий кодкак отделить, если и еще в MATLAB

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), но есть некоторые проблемы.

+0

Вы установили точку останова в коде, чтобы увидеть, всегда ли вы находитесь в if или else? – Vuwox

+2

Выберите _all_ вашего кода в редакторе MATLAB и нажмите CTRL + I. – chappjc

+0

Какие входные данные? Откуда вы знаете, что Wxcel дает правильный ответ? Если бы вы могли показать свою реализацию excel, возможно, мы сможем помочь вам разобраться в различии - описание того, что вы хотите сделать, не очень понятно ... – Floris

ответ

0

Если F, у являются вещественными, а не целые числа, я рекомендовал бы использовать, например

абса (F (I) -1) = < EPS

, где EPS является «малым номер»(например, eps = 1e-5) вместо

F (I) == 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); 
+0

это причина этого? –

+0

Имеет ли f или y реальные значения или просто целые числа? – Chris

+0

только целые числа, 0 и 1 –

Смежные вопросы