Your matrix a is a 1D vector and is incompatible with a nested loop that calculates the distance in 2D space from each point to another point. Thus, the following answer relates to the problem of finding all pairwise distances in the N-by-D matrix, since your cycle is executed for the case D=2 .
Option 1 - pdist
I think you are looking for a pdist with the 'euclidean' option.
a = randn(10, 2); %// 2D, 10 samples D = pdist(a,'euclidean'); %// euclidean distance
Follow this squareform to get a square matrix with zero diagonal as you wish:
distances = squareform(D);
Option 2 - bsxfun
If you do not have pdist , which is in the statistics toolbar, you can do this easily with bsxfun :
da = bsxfun(@minus,a,permute(a,[3 2 1])); distances = squeeze(sqrt(sum(da.^2,2)));
Option 3 - reformulated equation
You can also use an alternative form of Euclidean (2-normal) distance,
||AB|| = sqrt ( ||A||^2 + ||B||^2 - 2*AB )
Writing this to MATLAB for two data arrays u and v size NxD ,
dot(uv,uv,2) == dot(u,u,2) + dot(v,v,2) - 2*dot(u,v,2) % useful identity %
With the reformulated equation, the solution becomes:
aa = a*a'; a2 = sum(a.*a,2); % diag(aa) a2 = bsxfun(@plus,a2,a2'); distances = sqrt(a2 - 2*aa);
You can use this method if option 2 consumes too much memory.
Delays
For a random data matrix of size 1e3-3 (N-by-D), the timings for 100 runs are shown here (Core 2 Quad, 4 GB DDR2, R2013a).
- Option 1 (
pdist ): 1.561150 s (0.560947 s in pdist ) - Option 2 (
bsxfun ): 2.695059 sec. - Option 3 (
bsxfun alt): 1.334880 s
Conclusions: (i) Perform calculations using bsxfun , use an alternative formula. (ii) the pdist + squareform has comparable performance. (iii) The reason squareform takes twice as much time as pdist is likely because pdist only calculates a triangular matrix, since the distance matrix is ββsymmetric. If you can do without a square matrix, you can avoid squareform and do the calculations in about 40% of the time needed to do this manually using bsxfun (0.5609 / 1.3348).