一种更快速的计算向量误差的方法

时间:2015-11-12 00:31:32

标签: arrays algorithm matlab

对于给定的向量$(x_1,x_2,\ ldots,x_n)$我正在尝试计算

enter image description here

我写了以下代码

for l = 1:n
  for k = 1:n
    error = error + norm(x(i)-x(j))
  end
end

此代码速度不快,尤其是当$ n $很大时。我知道我实际上是在重复计算......但我怎么能避免它呢?我怎样才能加速我的代码?

谢谢!

2 个答案:

答案 0 :(得分:2)

你可以用bsxfun来做,这很快:

d = (abs(bsxfun(@minus, x, x.')));
result = sum(d(:));

或者使用pdist'cityblock'距离(一维观察值减少到绝对差值)。这会计算每个距离一次,因此您需要将总和乘以2

result = 2*sum(pdist(x(:),'cityblock'));

答案 1 :(得分:1)

简单的加速怎么样?

for a=1:n
  for b=a+1:n
     error = error + 2*norm(x(a)-x(b))
  end
end

对于标量,norm只给abs。 所以,

error = sum(abs( bsxfun(@minus, error,error') ))

会做同样的事情。

还会检查pdist,它会以更快的方式使用矢量规范为矢量执行此操作。