2015-02-09 54 views
1

我有3個載體,v1,v2,v3。我想得到的是它們之間的差異,即v1-v2,v1-v3,v2-v3。我怎樣才能做到這一點沒有在MATLAB中循環?多個載體之間的每個可能的差異

謝謝。

+0

我沒有combvec在我的matlab – aaa 2015-02-09 19:58:49

回答

0

代碼

%// Concatenate all vectors to form a 2D array 
V = cat(2,v1(:),v2(:),v3(:),v4(:),v5(:)) 

N = size(V,2) %// number of vectors 

%// Find all IDs of all combinations as x,y 
[y,x] = find(bsxfun(@gt,[1:N]',[1:N])) %//' 
%// OR [y,x] = find(tril(true(size(V,2)),-1)) 

%// Use matrix indxeing to collect vector data for all combinations with those 
%// x-y IDs from V. Then, perform subtractions across them for final output 
diff_array = V(:,x) - V(:,y) 

有關代碼

  1. bsxfunfind幾個點會讓我們的ID形成配對組合。
  2. 我們使用這些ID來索引到2D連接數組中,並在它們之間執行減法以獲得最終輸出。

獎金的東西

如果你仔細觀察到在那裏找到的所有組合的IDs的部分,即基本nchoosek(1:..,2)

所以,基本上可以有替代nchoosek(1:N,2)爲:

  1. [Y,X] = find(bsxfun(@gt,[1:N]',[1:N]))
  2. [y,x] = find(tril(true(N),-1))

[X Y]形成的配對組合,並可能是有趣的比較基準!

+0

謝謝,Divakar。我真的學到一些東西。 – aaa 2015-02-10 01:11:54

+0

@meng請開始接受這個問題和你以前的問題的解決方案!爲了接受特定的解決方案,您需要點擊解決方案旁邊的空白複選標記,以便空心複選標記變爲綠色複選標記! – Divakar 2015-02-10 02:03:14

+0

對不起,我的壞。我接受了。 – aaa 2015-02-10 02:30:54

1

使用bsxfun

clear 
clc 

%// Sample vectors. 
v1 = [1 2]; 
v2 = [10 20]; 
v3 = [0 0]; 


Out = bsxfun(@minus,[v1 v2 v3], [v1 v2 v3].') 

Out = 

    0  1  9 19 -1 -1 
    -1  0  8 18 -2 -2 
    -9 -8  0 10 -10 -10 
    -19 -18 -10  0 -20 -20 
    1  2 10 20  0  0 
    1  2 10 20  0  0 

推理:每個差計算從第一矢量的,直到最後一個矢量的第二元素的第一元素開始。第一列包含第一個向量的第一個元素的所有差異,即(1 -1),(1-2),(1-10),(1-20),(1-0) ,(1-0)。

然後第二列,同樣的事情,但這次與2:(2 - 1),(2 - 2),(2 - 10),等等。

對不起,如果我的解釋不清楚哈哈我不知道在英文的正確的條款。請詢問更多細節。

+0

真棒,最後!只是好奇,OP所說的「配對」會被照顧嗎? – Divakar 2015-02-09 20:13:03

+0

哦拍是的配對;我誤解了這個問題!我認爲@knedlsepp是正確的。 – 2015-02-09 20:36:59

3

只需使用nchoosek首先生成組合,然後利用它們來索引到你的行向量的陣列:

測試用例:

numVectors = 3; 
dim = 5; 
Vs = rand(numVectors, dim); 

實際計算:

combs = nchoosek(1:size(Vs,1), 2); 
differences = Vs(combs(:,1),:) - Vs(combs(:,2),:); 

上面創建了3維的5維隨機行矢量。所以在你的情況下,你可能想用Vs = [v1; v2; v3];代替隨機矩陣的創建,如果你的ve矩陣是行向量;或者如果您的數據是列向量,則使用Vs = [v1, v2, v3].';轉置載體。

+0

這可能是OP的真正之後,我想!使用'cat'也許可以從'v1','v2','v3'等創建'Vs'? – Divakar 2015-02-09 20:20:59

+0

@Divakar:增加了'貓'的細節,所以OP會知道如何使用它。 – knedlsepp 2015-02-09 20:28:23

+0

幹得好我也認爲這是OP之後的事情哦! +1 – 2015-02-09 20:37:21