2014-02-08 7 views
0

큰 행렬을 가지고 있는데,이 행렬을 A라고 부르 자. M = 4000 행 × 3 열. 행렬의 각 행에는 세 개의 숫자가 들어 있습니다. [241 112 478]. 이 세 숫자 중 세 쌍을 구성 할 수 있습니다 (예 : [241 112], [112 478], [241 478]. 다른 3999 개의 행 중 :MATLAB 큰 행렬에서 3 개의 원소 중 2 개가 포함 된 행을 효율적으로 찾습니다.

  • 세 쌍 각각에 대해 정확히 한 행의 M (하나만 포함)은 동일한 쌍을 포함합니다. 그러나 숫자 순서는 뒤죽박죽 일 수 있습니다. 예를 들어, 정확히 한 행에 [333 478 112]가 표시됩니다. 다른 행에는 478과 112가 둘 다 없을 것입니다. 3 개 쌍 각각에 대해 해당 행의 색인을 찾는 데 관심이 있습니다. 그런 다음 출력은 다른 행렬이어야하며, 동일한 크기 4000x3으로 B라고 부릅니다. 여기서 각 행은 원래 행렬 A의 행 인덱스를 가지고 숫자 쌍을 공유합니다.
  • 다른 행에는 동일한 세 개의 숫자가 포함되지 않습니다.
  • 다른 행에는 숫자 또는 숫자 중 하나가 포함될 수 없습니다.

다음은이 작업을 수행하는 기능이지만 매우 느립니다.보다 효율적인 방법이 있는지 알고 싶습니다. 미리 감사드립니다! 루프가 필요하지 않은 경우

M=size(A,1); % no elements 

B=zeros(M,3); 

for j=1:M 
    l=1; 
    k=1; 
    while l<4 % there cant be more than 3 
     if k~=j 
     s=sum(ismember(A(j,:),A(k,:))); 
     if s==2 
      B(j,l)=k; 
      l=l+1; 
     end 
    end 
    k=k+1; 
end 

답변

2

, 단지 ismember에게 다음과 같은 방법을 사용

row_id1=find(sum(ismember(M,[241 112]),2)>1); 
row_id2=find(sum(ismember(M,[478 112]),2)>1); 
row_id3=find(sum(ismember(M,[478 241]),2)>1); 

row_id 당신에게 그 라인에있는 한 쌍의 행 인덱스를 줄 것이다 상관없이 표시되는 정도.

당신이 찾는 쌍 번호 중 하나가 이 아니고이 두 번 연속으로 나타납니다 (예 : [112 333 112]). 이 가정이 틀린 경우 unique을 사용하여 해결할 수 있습니다.

+0

굉장하고, 훨씬 빠르게 작동합니다! 감사! – Kurt

관련 문제