2012-05-09 88 views
11

假設我有一個(m×n)矩陣Q和一個行向量r,例如,找到矩陣中的匹配行

Q = [ 1 2 3 ; 4 2 3 ; 5 6 7 ; 1 2 3 ; 1 2 3 ; 1 2 5 ]; 

r = [ 1 2 3 ]; 

什麼是獲得(長度爲m)的邏輯矢量指示哪些Q中的行是相同的(所有元素)到指定的行r的最簡單的方法?

在上面的示例情況下,這應該是

[ 1 0 0 1 1 0 ]; 
+0

與以下內容非常相關:http://stackoverflow.com/questions/6209904/find-given-row-in-a-matrix – neuronet

回答

19

您可以使用ismember並做到這一點在單行中:

>> ismember(Q,r,'rows')' 

ans = 

    1  0  0  1  1  0 
13
all(bsxfun(@eq, r, Q),2)' 

bsxfun(@eq, r, Q)比較每一行並返回與相同大小的矩陣爲Q:

>> bsxfun(@eq, r, Q) 

ans = 

    1  1  1 
    0  1  1 
    0  0  0 
    1  1  1 
    1  1  1 
    1  1  0 

all函數計算,如果bsxfun的結果都是分開的每一行。因此,它返回:

>> all(ans,2)' 

ans = 

    1  0  0  1  1  0 

,是的,也有置算'以匹配所需的行輸出

+1

值得注意的是,這比成員 –

0

更簡單的方法與repmat

a = [1 2 3; 4 5 6; 7 8 9]; 
t = [4 5 6]; 
[x,y] = size(a); 
r = all(a==repmat(t,y,1), 2)' 
+0

的速度還要快,效率也更低,見:http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/#9 –

+0

不需要的效率是一個詛咒。編寫和理解的簡單性直接關係到更好的代碼。 – Castilho

+0

關於'bsxfun(@eq,r,Q)''很難理解什麼?如果您通過這樣簡單的示例學習它,稍後您將在應用複雜問題時受益。 –

1
a = [1 1 1; 2 2 2; 3 3 3]; 
b = a(1:2,;); 
[temp locb] = ismember(a,b,'rows'); 
b(locb(locb~=0),:) 

ans = 

    1  1  1 
    2  2  2