2012-05-09 3 views
11

행렬 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 ]; 

지정된 열에서 R (모든 요소) Q의 행 중 어느 동일 나타내는 (m 길이의) 논리 벡터를 획득하는 가장 쉬운 방법은 무엇인가?

[ 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의 결과는 각 행을 따로 따로 모두 true입니다. 따라서 반환 :

>> 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 
관련 문제