Find a row in a matrix in faster way

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 commentaires

Matt Fig
Matt Fig le 29 Nov 2012
IA, the methods do not return the same results unless both matrices are binary....

Connectez-vous pour commenter.

 Réponse acceptée

Matt Fig
Matt Fig le 29 Nov 2012
Modifié(e) : Matt Fig le 29 Nov 2012
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 commentaires

Matt Fig
Matt Fig le 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
Matt Fig le 30 Nov 2012
Did you see that I used binary matrices??
nedo nodo
nedo nodo le 30 Nov 2012
Yes, thank you

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by