MATLAB有效地在大矩阵中找到包含三个元素中的两个元素的行

时间:2014-02-08 05:13:29

标签: arrays performance matlab matrix vectorization

我有一个大矩阵,我们称它为A,其尺寸为Mx3,例如M = 4000行×3列。矩阵中的每一行包含三个数字,例如。 [241 112 478]。在这三个数字中,我们可以构造三对,例如。 [241 112],[112 478],[241 478]。在其他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

1 个答案:

答案 0 :(得分:2)

不需要For循环,只需按以下方式使用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解决这个问题。