2014-02-08 49 views
0

我有一個大矩陣,我們稱之爲A,其尺寸爲Mx3,例如, M = 4000行×3列。矩陣中的每一行都包含三個數字,例如。 [241 112 478]。在這三個數字中,我們可以構造三對,例如。 [241 112],[112 478],[241 478]。在其他3999行中:MATLAB高效地找到在一個大矩陣中包含三個元素中的兩個元素的行

  • 對於三對中的每一對,恰好一行M(僅一個)將包含相同的對。但是,數字的順序可能會混亂。例如,只有一行將會顯示:[333 478 112]。沒有其他行將同時具有478和112. 我有興趣找到該行的索引,對於這三對中的每一對。然後輸出應該是另一個矩陣,稱之爲B,具有相同的尺寸4000x3,其中每行具有原始矩陣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

相關問題