2015-11-12 81 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這將使用向量規範,以更快的方式做到這一點。