2016-08-03 4 views
1

У меня есть две функции евклидова расстояния, одна из которых использует bsxfun, а другая - repmat. Они дали несколько разные результаты, на Matlab 2012a, OSX. Напримерmatlab bsxfun числовая точность

x = randn(32, 50); 
y = randn(32, 50); 

xx = sum(x.*x, 1); 
yy = sum(y.*y, 1); 
xy = x'*y; 

d1 = sqrt(abs(repmat(xx', [1 size(yy, 2)]) + repmat(yy, [size(xx, 2) 1]) - 2*xy)); 
d2 = sqrt(abs(bsxfun(@plus, xx', bsxfun(@minus, yy, 2*xy)))); 

isequal(d1, d2) 

figure;hist(d1(:)-d2(:), 50) 

Дает: enter image description here

Почему это, или я что-то пропустил?

+2

Для получения дополнительной информации, помимо ответа, как, почему, см (HTTP [плавающая добавление точек и умножение ассоциативно?]: // StackOverflow. com/questions/10371857/is-floating-point-addition-and-multiplication-associative), и из связанного ответа [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com /cd/E19957-01/806-3568/ncg_goldberg.html). – TroyHaskin

+0

@TroyHaskin Спасибо! – Maurits

ответ

4

Порядок действий, которые вы выполняете, отличается. Помещенный скобку как так

d1 = sqrt(abs(repmat(xx', [1 size(yy, 2)]) + (repmat(yy, [size(xx, 2) 1]) - 2*xy))); 

, и вы получите тот же результат