成对距离与公制pdist没有

时间:2013-10-12 01:37:49

标签: matlab

我无法想象为我的问题编写代码,因为我已经习惯使用pdist了。

我想要做的是计算向量的所有非绝对距离。所以我的度量标准只是(x-y),其中x和y是我向量中的两个值。

通常情况下,我会执行以下操作: squareform(pdist(X(:,i))

然而,这将返回EUCLIDEAN距离,而不是我的距离。 有没有办法用pdist做到这一点?或者可能有不同的方法?

这是我正在尝试计算的一个例子。

X=[1,2,3;4,5,6;7,8,9]

对于FIRST矩阵,第一列中所有元素差异的矩阵,我们应该

D=[(1-1), (1-4), (1-7); (4-1), (4-4), (4-7); (7-1), (7-4), (7-7)]

D=[0,-3,-6;3,0,-3;6,3,0]

1 个答案:

答案 0 :(得分:0)

我想您可能想要使用pdist的尝试“城市街区”指标:

pdist(X,'cityblock')

这很接近,但不是你需要的,所以你可以定义自己的距离函数并按如下方式使用它,

distfun = @(XI,XJ) sum(bsxfun(@minus,XI,XJ),2); % swap XI,XJ if needed
D = squareform(pdist(X,distfun))

请注意,您想要的非绝对距离指标是不对称,但pdist只计算矩阵的一半三角形, squareform强制它是对称的。如果这不是您想要的,请尝试循环:

>> X = [1 2 3; 4 5 6; 7 8 9];
>> D = zeros(size(X,1),size(X,1));
>> % for i=1:size(X,1), D(:,i)=sum(bsxfun(@minus,X,X(i,:)),2); end % my guess
>> % but to get the desired result, here's the appropriate loop:
>> for i=1:size(X,1), D(:,i) = sum(bsxfun(@minus,X,X(:,i)),1); end
>> disp(D)
     0    -3    -6
     3     0    -3
     6     3     0

编辑:OP示例数据和所需矩阵的解决方案。