Arrays MATLAB可以高效地找到一个大型矩阵中包含三个元素中的两个元素的行

Arrays MATLAB可以高效地找到一个大型矩阵中包含三个元素中的两个元素的行,arrays,performance,matlab,matrix,vectorization,Arrays,Performance,Matlab,Matrix,Vectorization,我有一个很大的矩阵,我们称之为a,它有维度Mx3,例如M=4000行x3列。矩阵中的每一行包含三个数字,例如[241 112 478]。在这三个数字中,我们可以构造三对,例如[241112]、[112478]、[241478]。在其他3999行中: 对于三对中的每一对,正好一行M(仅一行)将包含同一对。然而,数字的顺序可能会被打乱。例如,只有一行的内容为:[333 478 112]。没有其他行同时具有478和112我感兴趣的是为三对中的每一对找到该行的索引。然后,输出应该是另一个矩阵,称为B,

我有一个很大的矩阵,我们称之为a,它有维度Mx3,例如M=4000行x3列。矩阵中的每一行包含三个数字,例如[241 112 478]。在这三个数字中,我们可以构造三对,例如[241112]、[112478]、[241478]。在其他3999行中:

  • 对于三对中的每一对,正好一行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
M=尺寸(A,1);%无元素
B=零(M,3);
对于j=1:M
l=1;
k=1;

虽然不需要lFor循环,但只需按以下方式使用
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\u id
将为您提供该行中该对的行索引,而不管其显示顺序如何

这里所做的唯一假设是,您查找的一对数字将连续出现两次(即
[112 333 112]
)。如果该假设是错误的,则可以使用
unique
解决此问题