フィルターのクリア

Find a row in a matrix in faster way

4 ビュー (過去 30 日間)
nedo nodo
nedo nodo 2012 年 11 月 29 日
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 件のコメント
Image Analyst
Image Analyst 2012 年 11 月 29 日
Matt Fig
Matt Fig 2012 年 11 月 29 日
IA, the methods do not return the same results unless both matrices are binary....

サインインしてコメントする。

採用された回答

Matt Fig
Matt Fig 2012 年 11 月 29 日
編集済み: Matt Fig 2012 年 11 月 29 日
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 件のコメント
Matt Fig
Matt Fig 2012 年 11 月 30 日
Did you see that I used binary matrices??
nedo nodo
nedo nodo 2012 年 11 月 30 日
Yes, thank you

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeNumeric Types についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by