2015-09-12 7 views
1

Я хочу написать функцию в Matlab для
enter image description hereи, если еще условие в MATLAB

Это то, что я написал.

function f=hamacher(x,y) 
for i=1:5 
    if x==0.00 & y==0.00 
     f=0; 
    else 
     f=(x.*y)./(x+y-(x.*y)); 
    end 
end 
end 

Если я позволю

>> p=[0 0.5 1 0 0.75]; 
>> q=[0 0.2 0 0 0.8]; 
>> hamacher(p,q) 

ans = 

     NaN 0.1667   0  NaN 0.6316 

Это приводит NaN и не 0 из-за 0/0. Я хочу, чтобы справиться с этой проблемой с помощью
if x==0.00 & y==0.00 f=0;

Почему это не if заявления справиться с этим?
Может кто-нибудь, пожалуйста, скажите мне, как я могу это исправить.

+0

Чтобы понять поведение, я рекомендую прочитать документацию, если внимательно. Ваше выражение 'x == 0.00 & y == 0.00' верно только в том случае, если все элементы отличны от нуля. Это означает, что ваш ввод содержит только нулевые элементы. – Daniel

+0

Кроме того, ваш цикл 'for', кажется, ничего не добавляет, вы просто оцениваете одно и то же выражение 5 раз. – Adriaan

ответ

1
function f=hamacher(x,y) 
f = zeros(numel(x),1); 
for ii=1:numel(x) 
    if x(ii)==0 && y(ii)==0 
     f(ii,1)=0; 
    else 
     f(ii,1)=(x(ii)*y(ii))/(x(ii)+y(ii)-(x(ii)*y(ii))); 
    end 
end 
end 
>> p=[0 0.5 1 0 0.75]; 
>> q=[0 0.2 0 0 0.8]; 
>> hamacher(p,q) 
ans = 

     0 
    0.1667 
     0 
     0 
    0.6316 

Я вполне уверен, что это то, что вы хотели. Я просто убедился, что все работает элементально, а не векторизовано.

+0

Спасибо. Он работает правильно. Не могли бы вы объяснить, что означает 'f = нули (numel (x), 1),' do? – clarkson

+0

Инициализирует 'f', чтобы иметь один столбец и' numel (x) 'rows, т. Е. Столько строк, сколько есть элементов в' x'. Инициализация переменных всегда является хорошей идеей относительно требований к вычислительному времени и памяти. – Adriaan

3

Поскольку ваша функция vectorized, используйте logical indexing различать два случая поэлементно:

ind = x==0 & y==0; 
f(ind) = 0; 
f(~ind) = x(~ind).*y(~ind)./(x(~ind)+y(~ind)-(x(~ind).*y(~ind))); 
Смежные вопросы