2015-11-12 55 views
1

对于给定的矢量$(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 $很大时。我知道我实际上是双重计数......但我怎么可能避免它?我如何加快我的代码?

谢谢!

+0

是否存在内循环,如数学符号中的代码所示? – Steephen

回答

2

你可以用bsxfun做到这一点,这是快:

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

或者选择使用pdist'cityblock'距离(这对于一维的观察降低到绝对差)。这种计算每个距离一次,所以你需要通过2乘以总和:

result = 2*sum(pdist(x(:),'cityblock')); 
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这将使用向量规范,以更快的方式做到这一点。