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

*No products are associated with this question.*

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)

Related Content

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

Learn moreOpportunities for recent engineering grads.

Apply Today
## 2 Comments

## Image Analyst (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/55198#comment_114374

Are they integer or floating point? http://matlab.wikia.com/wiki/FAQ#Why_is_0.3_-_0.2_-_0.1_.28or_similar.29_not_equal_to_zero.3F

## Matt Fig (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/55198#comment_114381

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