Find equal rows between two Matlab matrices

  • A+
Category:Languages

I have a matrix index in Matlab with size GxN and a matrix A with size MxN.

Let me provide an example before presenting my question.

clear N=3; G=2; M=5;  index=[1  2  3;        13 14 15]; %GxN  A=[1  2  3;     5  6  7;     21 22 23;     1  2  3;    13 14 15]; %MxN 

I would like your help to construct a matrix Response with size GxM with Response(g,m)=1 if the row A(m,:) is equal to index(g,:) and zero otherwise.

Continuing the example above

Response= [1 0 0 1 0;             0 0 0 0 1]; %GxM 

This code does what I want (taken from a previous question of mine - just to clarify: the current question is different)

Response=permute(any(all(bsxfun(@eq, reshape(index.', N, [], G), permute(A, [2 3 4 1])), 1), 2), [3 4 1 2]); 

However, the command is extremely slow for my real matrix sizes (N=19, M=500, G=524288). I understand that I will not be able to get huge speed but anything that can improve on this is welcome.

 


Aproach 1: computing distances

If you have the Statistics Toolbox:

Response = ~(pdist2(index, A)); 

or:

Response = ~(pdist2(index, A, 'hamming')); 

This works because pdist2 computes the distance between each pair of rows. Equal rows have distance 0. The logical negation ~ gives 1 for those pairs of rows, and 0 otherwise.

Approach 2: reducing rows to unique integer labels

This approach is faster on my machine:

[~,~,u] = unique([index; A], 'rows'); Response = bsxfun(@eq, u(1:G), u(G+1:end).'); 

It works by reducing rows to unique integer labels (using the third output of unique), and comparing the latter instead of the former.

For your size values this takes approximately 1 second on my computer:

clear N = 19; M = 500; G = 524288; index = randi(5,G,N); A = randi(5,M,N); tic [~,~,u] = unique([index; A], 'rows'); Response = bsxfun(@eq, u(1:G), u(G+1:end).'); toc 

gives

Elapsed time is 1.081043 seconds. 

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: