2015-04-14 49 views
2

所有索引所以說我有兩個數組:使用列表中ismember

A:14 63 13 
     38 44 23 
     11 12 13 
     38 44 23 

    B:38 44 23 

我試圖用ismember返回那裏BA發現每個位置的指數。我在網上找到的所有例子都只列出匹配的第一個或最後一個匹配項,我試着爲所有匹配的值設置一個列表索引,甚至重複匹配。由於

+0

你期望的結果'[2〜4]'即使'B'是'[38 23 44]'?你不清楚! –

回答

6

使用ismember'rows' arugment:

ismember(A, B, 'rows') 

導致邏輯陣列[0 1 0 1]這通常是賭注之三比索引數組,但如果你想索引專門就用find

find(ismember(A,B,'rows')) 

返回[2,4]

注意,此方法仍然有效,如果B具有多行如B = [38 44 23; 11 12 13],它將返回[0; 1; 1; 1]

5

可以使用bsxfun爲comarison:

idx = find(all(bsxfun(@eq, A, B), 2)); %// only where all line matches 

結果與

idx = 
2 
4 
+0

我得到一個錯誤「兩個輸入數組的非單獨維度必須相互匹配。」這是因爲我的A和B是不同的尺寸?我的A的大小是345000x3,B的大小是19811x3。 – Dark

+0

@與您的問題中的設置相比,您的設置與您的設置有所不同**!你對不同尺寸的'A'和'B'有什麼期望?你在尋找每一行「B」的所有索引嗎? – Shai

+0

@Dark,對於'A'和'B'的這些大小,對'B'的每一行使用'for'循環。輸出'idx'到一個單元格數組 – Shai

2

這是shai's answer處理B

idx = find(any(all(bsxfun(@eq, A, permute(B,[3 2 1])), 2),3)); 

樣品試驗的多行只是一個改進版:

A = [14 63 13; 
    38 44 23; 
    11 12 13; 
    38 44 23]; 

B = [38 44 23; 
    11 12 13]; 

idx = find(any(all(bsxfun(@eq, A, permute(B,[3 2 1])), 2),3)); 

>> idx 

idx = 

2 
3 
4 
3

你可以看看pdist2如果您有A和B爲Nx3大小的陣列 -

[indA,indB] = ind2sub([size(A,1) size(B,1)],find(pdist2(A,B)==0)); 

ind = [indA,indB] 

因此,在ind中,第一列匹配的成對索引代表A的索引,第二列匹配B

採樣運行 -

A = 
    14 63 13 
    38 44 23 
    11 12 13 
    14 63 13 
    38 44 23 
B = 
    38 44 23 
    14 63 13 
ind = 
    2  1 
    5  1 
    1  2 
    4  2 
+0

'pdist2'解決方案在比較行明智的平等+1時非常優雅:) –