cys
cys

Reputation: 41

Pairwise distance matrix between two vectors

x1=[1,2,3]
x2=[2,3,4]

how to find the Pairwise distance matrix between x1 and x2 (distance matrix should be a 3 x 3 matrix)

Upvotes: 1

Views: 417

Answers (4)

GKi
GKi

Reputation: 39657

You can try:

abs.(x1 .- x2')
#3×3 Array{Int64,2}:
# 1  2  3
# 0  1  2
# 1  0  1

Where x2' turns x2 in a column vector and .- and abs. makes element wise operations.
Or creating the desired pairs (1,2)and(2,3), (1,2)and(2,4), ... (2,3)and(3,4) and calculating the distance using norm.

using LinearAlgebra

#Create pairs
c1 = [(x1[i], x1[j]) for i in 1:lastindex(x1)-1 for j in i+1:lastindex(x1)]
c2 = [(x2[i], x2[j]) for i in 1:lastindex(x2)-1 for j in i+1:lastindex(x2)]

#Calc distance
[norm(i.-j) for i in c1, j in c2]
#3×3 Array{Float64,2}:
# 1.41421  2.23607  2.82843
# 1.0      1.41421  2.23607
# 0.0      1.0      1.41421

#Calc cityblock distance
[norm(i.-j, 1) for i in c1, j in c2]
#3×3 Array{Float64,2}:
# 2.0  3.0  4.0
# 1.0  2.0  3.0
# 0.0  1.0  2.0

Upvotes: 1

phipsgabler
phipsgabler

Reputation: 20950

With Distances.jl:

julia> pairwise(Euclidean(), x1, x2)
3×3 Matrix{Float64}:
 1.0  2.0  3.0
 0.0  1.0  2.0
 1.0  0.0  1.0

(Although this will not return integers, as it uses BLAS stuff internally.)

Upvotes: 1

AboAmmar
AboAmmar

Reputation: 5559

Since you ask for Euclidean distance between all combinations of vector pairs from x1 and x2, that's, the distance between [1, 2] and [2, 3], [1, 2] and [2, 4], ..., [2, 3] and [3, 4], this can be done as follows:

Using Combinatorics.jl, construct all pairs from x1 by taking 2 elements at a time. Do the same for x2. Now you have c1 and c2, just loop over the two sequences applying the formal definition of Euclidean distance, sqrt(sum((x-y)^2)), to get the 3-by-3 matrix of pairwise distances that you want.

using Combinatorics

x1 = [1, 2, 3]
x2 = [2, 3, 4]

c1 = combinations(x1, 2)
c2 = combinations(x2, 2)

pairwise = [sqrt(sum((i.-j).^2)) for i in c1, j in c2]
3×3 Matrix{Float64}:
 1.41421  2.23607  2.82843
 1.0      1.41421  2.23607
 0.0      1.0      1.41421

If you like higher-order index notations similar to math books, you can use Tullio.jl like this:

using Tullio

x = collect(combinations(x1, 2))
y = collect(combinations(x2, 2))

@tullio pairwise[i,j] := sqrt(sum((x[i].-y[j]).^2))
3×3 Matrix{Float64}:
 1.41421  2.23607  2.82843
 1.0      1.41421  2.23607
 0.0      1.0      1.41421

Upvotes: 1

Bill
Bill

Reputation: 6086

This is not a Euclidean distance matrix, but it is 3 X 3. Is it what you want?

julia> x1 = [1,2,3]
3-element Vector{Int64}:
 1
 2
 3

julia> x2 = [2,3,4]
3-element Vector{Int64}:
 2
 3
 4

julia> [(a-b)^2 for a in x1, b in x2]
3×3 Matrix{Int64}:
 1  4  9
 0  1  4
 1  0  1

Upvotes: 1

Related Questions