File Exchange

image thumbnail


version (814 Bytes) by R. Bunschoten
A fully vectorized function that computes the Euclidean distance matrix between two sets of vectors.


Updated 03 Nov 1999

No License

A fully vectorized function that computes the Euclidean distance matrix between two sets of vectors.

The output is the same as MathWorks' (Neural Network Toolbox) 'dist' funtion (ie, d = dist(A',B), where A is a (DxM) matrix and B a (DxN) matrix, returns the same as my d = distance(A,B) ), but this function executes much faster.

Comments and Ratings (33)

ashkan abbasi


Maksim (view profile)

Faster than builtin pdist2 in R2016a.

Benoît THOUY

Following the analysis of Stuart Layton, I've found a merely faster way to perform the same computation:

d = sqrt(bsxfun(@minus,bsxfun(@plus,sum(a.^2,1),sum(b.^2,1)'),2*(a'*b).'));

Using the same tool as Stuart Layton (modified to have the tic/toc outside the loop), I measure 4.3607ms for distance.m and 4.1252ms for mine. Does not change dramatically, ok.


Hi, I am new to this so how would I exactly inputthis on matlab? if anyone can help me please

Thanks. This saved me time!


vince (view profile)

I find a simple


faster to compute the Euclidean distance

Thanks. using repmat has made it useful and fast.

Things can go wrong in extreme cases.
If dimensionality is very high numerical errors will kick in.

I have twenty-five hundred 10'000 dimensional vectors stored in matrix X and

sum(diag(distance(X',X'))) = 6e-4;

Other than that, great job!

T. R.

T. R. (view profile)


George (view profile)

Why is the -2ab term included?

Stuart Layton

I find the original code to be faster than the method put forth by oliver
s = 100000; a = rand(5,s); b = rand(5,1); t = []; n = 1000;
disp(['Data Points: ', num2str(s), ' iterations: ', num2str(n)]);
for i=1:n
tic; d = distance(a,b); t(i) = toc;

disp(['Average run time: ', num2str(mean(t))]);
t = [];
for i=1:n
tic; d = sqrt(bsxfun(@plus,dot(a,a,1)',dot(b,b,1))-2*a'*b); t(i) = toc;
disp(['Average run time: ', num2str(mean(t))]);

Data Points: 100000 iterations: 1000
Average run time: 0.01356
Average run time: 0.020044

According to Oliver Woodford, on my macbook the fastest is

d = sqrt(bsxfun(@plus,dot(a,a,1)',dot(b,b,1))-2*a'*b);

Could be faster still by using bsxfun:
d = sqrt(abs(bsxfun(@plus, aa', bb) - 2*a'*b));

Philipp Berens

Quick and clean.

What might be nice: Optional only one argument.

Panyam Narahari Sastry


M. Shoaib Sehgal

for vectors it simple to compute using:

distance = norm(A-B)

A. S.

Very useful, especially Markus' version.

Xi-Lin Li

very good code


Markus Buehren

Sorry, I forgot the sqrt:

d = sqrt(abs(aa( ones(size(bb,2),1), :)' + bb( ones(size(aa,2),1), :) - 2*a'*b));

Markus Buehren

Simple but nice. Performance can still be improved by about 60% by avoiding calls to repmat:

d = abs(aa( ones(size(bb,2),1), :)' + bb( ones(size(aa,2),1), :) - 2*a'*b);


Enrique Guevara

Is a very fast code. Is faster than any other code for any vectors biger that 8 points.

Catherine Sweeney-Reed

Great! Thanks!

Babak Taati


Anton Cervantes

Hsuan-Tien Lin

great code

uday desai

Emily Van Ark

great, fast little function. Exactly what I was looking for!

imad ali

need the file

ti saigon

Peter G


Jan de Vries


MATLAB Release Compatibility
Created with R10
Compatible with any release
Platform Compatibility
Windows macOS Linux
Tags Add Tags

Discover Live Editor

Create scripts with code, output, and formatted text in a single executable document.

Learn About Live Editor