2014-03-12 33 views
0

我有一个简单的函数来计算两个向量之间的距离,例如距离=点积/两个向量中元素的总和。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中每两排之间的相似性(距离= 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对角线值,因为我不关心从一行到它自己的距离。

+0

我想你也可以写' d = dot(a(ones(1,size(b,1)),b)/(sum(a)+ sum(b))''我认为'bsxfun'解决方案会更快 –

回答

2

传递给pdist函数必须采取

作为参数1乘n矢量XI,对应于X的单排,和一平方米乘n矩阵XJ,对应于多个X. distfun的行必须接受具有任意数量行的矩阵XJ。 distfun必须返回距离D2,其第k个元素是XI和XJ(k之间的距离的M2-1向量,:)

所以:

d = sum(bsxfun(@times,a,b),2) ./ (sum(a,2) + sum(b,2)); 
+0

谢谢!我的功能不是那么简单,请检查这个问题。我现在更清楚了。http://stackoverflow.com/questions/22359113/matlab-pdist-nonzero-cosine-similarity – CSawy