2014-09-18 2 views

ответ

12

Вот простой способ

n = 10 
x = rand(n) 
y = rand(n) 
d = norm(x-y) # The euclidean (L2) distance 

Для Manhattan/таксомотора/L1 расстояние, используйте norm(x-y,1)

11

Это легко сделать благодаря прекрасной Distances упаковке:

Pkg.add("Distances") #if you don't have it 
Using Distances 
one7d = rand(7) 
two7d = rand(7) 
dist = euclidean(one7d,two7d) 

Кроме того, если у вас есть сказать, 2 матрицы 9D векторов Col, вы можете получить расстояние между каждой соответствующей пары с помощью colwise:

thousand9d1 = rand(9,1000) 
thousand9d2 = rand(9,1000) 
dists = colwise(Euclidean(), thousand9d1, thousand9d2) 
#returns: 1000-element Array{Float64,1} 

Вы также можете сравнить один вектор, например происхождение (если вы хотите величину каждого вектора-столбца)

origin9 = zeros(9) 
mags = colwise(Euclidean(), thousand9ds1, origin9) 
#returns: 1000-element Array{Float64,1} 

Другие расстояния также доступны:

  • Squared евклидовой
  • Cityblock
  • Чебышева
  • Минковский
  • Хэмминга
  • Косинус
  • Корреляция
  • хи-квадрат
  • Кульбак-Лейблер дивергенция
  • Jensen-Шеннона расхождение
  • Махаланобиса
  • Squared Махаланобиса
  • Бхаттачариа
  • Хеллингера

Подробнее на package's github page here.

+1

+1 Спасибо за воспитывающим пакет 'Distances'. Я думаю, что на вопрос ОФ достаточно ответили 'norm()', но полезно знать о пакете. – Rhubarb

+1

Это также работает для размеров выше 2 (норма поддерживает только 1- или 2-мерные массивы). Например, 'norm (rand ((4,4,4)) - rand ((4,4,4)))' будет терпеть неудачу –