0

我有一个简单的函数来计算两个向量之间的距离,这样距离 = 点积 / 两个向量中元素的总和。

  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 中每两行之间的相似度(距离 = 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 矩阵是

dist =    
          Inf        0.625          1.1
        0.625          Inf         1.25
          1.1         1.25          Inf

注意:循环或填充矩阵后,我用 inf 填充对角线值,因为我不关心行到自身的距离。

4

1 回答 1

2

您传递给的函数pdist必须采用

作为参数,一个 1×n 向量 XI,对应于 X 的单行,以及一个 m2×n 矩阵 XJ,对应于 X 的多行。 distfun 必须接受具有任意行数的矩阵 XJ。distfun 必须返回一个距离为 d2 的 m2×1 向量,其第 k 个元素是 XI 和 XJ(k,:) 之间的距离

所以:

d = sum(bsxfun(@times,a,b),2) ./ (sum(a,2) + sum(b,2));
于 2014-03-12T06:56:49.400 回答