matlab bsxfun数值精度
matlab bsxfun numerical precision
我有两个欧几里德距离函数,一个使用 bsxfun
,另一个使用 repmat
。他们在 Matlab 2012a OSX 上给出了略有不同的结果。例如
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)
给出:
这是为什么,还是我漏掉了什么?
您执行的操作顺序不同。像这样放括号
d1 = sqrt(abs(repmat(xx', [1 size(yy, 2)]) + (repmat(yy, [size(xx, 2) 1]) - 2*xy)));
你会得到相同的结果
我有两个欧几里德距离函数,一个使用 bsxfun
,另一个使用 repmat
。他们在 Matlab 2012a OSX 上给出了略有不同的结果。例如
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)
给出:
这是为什么,还是我漏掉了什么?
您执行的操作顺序不同。像这样放括号
d1 = sqrt(abs(repmat(xx', [1 size(yy, 2)]) + (repmat(yy, [size(xx, 2) 1]) - 2*xy)));
你会得到相同的结果