1

我很难为我的问题可视化编写代码,因为我已经习惯使用pdist.

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

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

然而,这将返回欧几里得距离,而不是我的距离。有没有办法用 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]

4

1 回答 1

0

我认为您可能想使用以下的尝试“城市街区”指标pdist

pdist(X,'cityblock')

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

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

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

>> 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 示例数据和所需矩阵的解决方案。

于 2013-10-12T01:57:29.400 回答