对于给定的向量$(x_1,x_2,\ ldots,x_n)$我正在尝试计算
我写了以下代码
for l = 1:n
for k = 1:n
error = error + norm(x(i)-x(j))
end
end
此代码速度不快,尤其是当$ n $很大时。我知道我实际上是在重复计算......但我怎么能避免它呢?我怎样才能加速我的代码?
谢谢!
答案 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
,它会以更快的方式使用矢量规范为矢量执行此操作。