Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Find a row in a matrix in faster way

Asked by nedo nodo on 29 Nov 2012

Hi,

I have to compare two matrices: in detail, I have to find if each row of a matrix1 is contained in a matrix2. Then I have to store the corresponding positions in a vector.

The following is a trivial method and seems to be faster than ismember version.

if true
    t1=tic;
    for m=1:size(matrix1,1)
      for l=1:size(matrix2,1)
        if(sum(xor(matrix1(m,:), matrix2(l,:)))==0)
            vector(m)=l;
        end   
      end
    end
   toc(t1)
end

ismember version.

if true
  t2=tic;
  for m=1:size(matrix1,1)
    index=ismember(matrix2,matrix1(m,:),'rows');
    l=find(index);
    vector(m)=l;
  end
  toc(t2)
end

Is there a way to speed up such computation? Thank

2 Comments

Matt Fig on 29 Nov 2012

IA, the methods do not return the same results unless both matrices are binary....

nedo nodo

Products

No products are associated with this question.

1 Answer

Answer by Matt Fig on 29 Nov 2012
Edited by Matt Fig on 29 Nov 2012
Accepted answer

Here is a faster method, in the script I use to compare:

M1 = rand(1000,8)>.5;
M2 = rand(1000,8)>.5;
tic  % Method 1, use XOR
V1 = zeros(1,size(M1,1));
for m=1:size(M1,1)
    for n=1:size(M2,1)
        if(sum(xor(M1(m,:), M2(n,:)))==0)
            V1(m)=n;
        end
    end
end
toc
tic  % Method 2, use ISMEMBER
V2 = zeros(1,size(M1,1));
for m=1:size(M1,1)
    index=ismember(M2,M1(m,:),'rows');
    n = find(index,1,'last');
    if ~isempty(n)
        V2(m)=n;
    end
end
toc
tic  % Method 3, use BSXFUN
V3 = zeros(1,size(M1,1));
for m=1:size(M1,1)
    index=all(bsxfun(@eq,M1(m,:),M2),2);
    n = find(index,1,'last');
    if ~isempty(n)
        V3(m)=n;
    end
end
toc
isequal(V1,V2,V3)

3 Comments

Matt Fig on 30 Nov 2012

nedo nodo comments:

Hi,

thank you for your answer. I forgot to say that the matrices are binary I don't know if it makes some difference.

Thank you

Matt Fig on 30 Nov 2012

Did you see that I used binary matrices??

nedo nodo on 30 Nov 2012

Yes, thank you

Matt Fig

Contact us