Find a row in a matrix in faster way
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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
Image Analyst
le 29 Nov 2012
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
le 29 Nov 2012
IA, the methods do not return the same results unless both matrices are binary....
Réponse acceptée
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
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!