2015-09-14 5 views
-3

Hamacher сумма:
enter image description hereMATLAB код Hamacher суммы

Я написал следующий MATLAB код для вышеуказанной функции

function f=hamachersum(x,y) 
f = zeros(numel(x),1); 
for j=1:numel(x) 
    if x(j)==1 && y(j)==1 
     f(j,1)=1; 
    else 
     f(j,1)=(x(j)+y(j)-2*(x(j)*y(j)))/(1-(x(j)*y(j))); 
    end 
end 
end 

Тогда я хочу, чтобы проверить t3=hamachersum(t1,t2)
Мои входные значения t1, t2 являются

t1

t1 =

1.0000 
    0 
1.0000 
1.0000 
1.0000 
1.0000 
    NaN 
0.8167 
1.0000 
1.0000 
1.0000 
0.4667 
    NaN 
1.0000 
1.0000 
1.0000 
    NaN 
    NaN 
1.0000 
1.0000 
1.0000 
    NaN 
0.0250 
1.0000 

t2

t2 =

1.0000 
0.5524 
1.0000 
1.0000 
1.0000 
1.0000 
    NaN 
    0 
1.0000 
1.0000 
1.0000 
1.0000 
    NaN 
1.0000 
1.0000 
1.0000 
    NaN 
    NaN 
0.6032 
1.0000 
1.0000 
    NaN 
0.9973 
0.7260 

В результате

t3 = 

    1.2000 
    0.5524 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
     NaN 
    0.8167 
    2.0000 
    2.0000 
    1.0000 
    1.0000 
     NaN 
    0.6667 
    1.0000 
    1.0769 
     NaN 
     NaN 
    1.0000 
    1.0000 
    1.0000 
     NaN 
    0.9973 
    1.0000 

Почему я получаю значения от выше 1. Поскольку это нечеткий оператор, у него не может быть значений выше 1.

В коде есть что-то неправильное?

+2

Установка 't1 = [0: 0.01: 1] ';' 't2 = t1',' t3 = hamachersum (t1, t2) 'приводит к значениям от 0 до 1, также как и при использовании' t2 = flipud (t1) '. Я не могу найти ошибку в этом коде, запустив его на R2012a. – Adriaan

+3

. Вы не показываете правдивый 't3'. Включение первых элементов 't1 (1) == 1' и' t2 (1) == 1' явно дает '1', а не' 1.2'. Пожалуйста, покажите реальный ответ. –

+0

@MadPhysicist Это результат, который я получаю при запуске на R2014a –

ответ

3

Я, вероятно, отвечаю на это против моего лучшего суждения.

Caveat: Я не знаком с суммой Hamacher, поэтому мой подход к ответу строго основан на уравнении вашего вопроса.


Есть ли что-то не так в моем коде?

Ваш код производит 1.0, когда я запускаю его на MATLAB R2014a для входов 1.0 и 1.0, я предполагаю, что это правильно, как у вас есть явное условие для него. Я не могу привести результаты, которые вы видите в своем вопросе.

Однако я был вынужден обеспечить более эффективную реализацию уравнения

function h = hamachersum(mu_a, mu_b) 
    h = (mu_a + mu_b - (2 .* mu_a .* mu_b)) ./ (1 - mu_a .* mu_b); 
    % h(isnan(h)) = 1.0; % Included this line to show you how to remove NaN 
end 

Примечание: Я включил % h(isnan(h)) = 1.0;, чтобы показать вам, как обрабатывать случаи, когда mu_a и mu_b являются оба 1.0, как вы явным образом рассмотрел это в вашем вопросе (довольно плохо могу добавить).


Сравнение чисел с плавающей точкой не является надежным даже в среде MATLAB и может быть одной из причин, почему вы получаете результаты, которые вы.Лучший способ проверить, что значение числа с плавающей точкой будет использовать

if (x - 1.0 > 1e-15) 
    fprintf(1, "x == 1.0"); 
else 
    fprintf(1, "x ~= 1.0"); 
end 

Если x равно 1.0 до машинной точности этого выражения будет true иначе будет false.