Matlab использует мою собственную функцию расстояния для pdist

У меня есть простая функция, чтобы вычислить расстояние между двумя векторами, так что расстояние = скалярное произведение / сумма элементов в двух векторах.

  function d = simpleDistance(a,b)
    d = dot(a,b)/ (sum(a) + sum(b));
  end

например: simpleDistance([1 2], [3 4]) = (3 + 8) / (3 + 7) = 11/10 = 1.1

Учитывая эту маленькую матрицу r, я хочу вычислить сходство между каждыми двумя строками в r (distance = simpleDistance)

r =
 1     2
 5     0
 3     4

Вместо двух вложенных циклов я хочу использовать функцию pdist, потому что она ПУТЬ БЫСТРО!

n = size(r,1);
dist = squareform(pdist(r,@simpleDistance)); % distance matrix
dist(1:n+1:end) = inf; % self-distance doesn't count

Тем не менее, я получаю эту ошибку

Error using pdist (line 373)
Error evaluating distance function 'simpleDistance'.

Caused by:
    Error using dot (line 34)
    A and B must be same size.

для матрицы r, приведенной выше, я ожидаю, что dist matrix будет

dist =    
          Inf        0.625          1.1
        0.625          Inf         1.25
          1.1         1.25          Inf

Примечание: после зацикливания или заполнения матрицы я заполняю диагональные значения inf, так как мне не важно расстояние от строки до самого себя.

1 ответ

Решение

Функция, которую вы передаете pdist должен взять

в качестве аргументов 1-на-n-вектор XI, соответствующий одной строке X, и матрица XJ m2-на-n, соответствующая нескольким строкам X. distfun должен принимать матрицу XJ с произвольным числом строк. distfun должен возвращать вектор м2-на-1 расстояний d2, k-й элемент которых является расстоянием между XI и XJ(k,:)

Так:

d = sum(bsxfun(@times,a,b),2) ./ (sum(a,2) + sum(b,2));
Другие вопросы по тегам