2013-10-12 21 views
1

我在嘗試爲我的問題顯示編寫代碼時遇到問題,因爲我很習慣使用pdist與度量pdist的成對距離沒有

我想要做的是計算矢量的所有非絕對距離。所以我的度量只是(x-y),其中x和y是我的向量中的兩個值。

通常情況下,我只想做到以下幾點: squareform(pdist(X(:,i))

然而,這將返回歐幾里得距離,不是我的距離。 有沒有辦法與pdist做到這一點?或者也許有不同的方法?

下面是我試圖計算的一個例子。

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

對於第一矩陣,在第一列中的元素的所有差的矩陣,我們應該有

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]

+0

我只是修復'distfun'來做你所需要的。對不起,以前的錯誤。它需要'bsxfun'和'sum'。這次測試。 – chappjc

+0

雖然看到您可以提出自己的指標很有用,但這並不是我想要的。儘管如此,我仍然試圖想出一個示例。非常感謝您的幫助。 –

+0

另外,我對這種混亂表示歉意,我對自己真正想要的東西感到困惑。 –

回答

0

我想你可能想用的「城市街區」度量:

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例如數據和所需的基質。

+0

我真的只想讓城市街區指標減去絕對值,但您也提供了答案,謝謝! –

+0

我在某種程度上輸入錯了嗎?我不斷收到「distfunc」以前用作變量, 與此處作爲函數的名稱或 命令衝突。「 –

+0

固定'distfun'定義。我早前出去吃午飯,對不起!您需要使用'bsxfun'用於你想要的減號運算,加上sum,並且不用'abs'或'。^ 2'。這次測試! – chappjc