ismember function too slow

조회 수: 23 (최근 30일)
Salvatore Mazzarino
Salvatore Mazzarino 2012년 10월 17일
답변: Omar Ali Muhammed 2021년 3월 3일
I have to improve the speed of my simulation. Well my code is quite simple. I have a vector A=[1 2 3 4 5 6 7 8 9 10] and another vector B=[3 4 9]. I use ismember to check if every element is into A matrix.
for n=1:length(A)
if ismember(B(n),A)
do-something
end
end
this part of my code is executed so many time in my simulation and my matrices are really big.some idea to improve my code?
  댓글 수: 1
Matt J
Matt J 2012년 10월 17일
Since this is speed-critical, it would be wise for you to elaborate on "do-something". That could point the way to eliminating the for-loop altogether, or some other kind of performance optimization.

댓글을 달려면 로그인하십시오.

답변 (5개)

Jonathan Epperl
Jonathan Epperl 2012년 10월 17일
Don't you want to actually INTERSECT A and B? If so, then here's a very fast intersect function that intersects two sets of positive integers only. If you have negative integers you could obviously shift. If you have reals you're SOL. If your integers are greater than ~1e5 the speed gain is negligible.
C = fastintersect(A,B)
if ~isempty(A)&&~isempty(B)
P = zeros(1, max(max(A),max(B)) ) ;
P(A) = 1;
C = B(logical(P(B)));
else
C = [];
end
Obviously you could leave out the check for emtpy sets if you know you won't have empty sets.
  댓글 수: 4
Shengtao Wang
Shengtao Wang 2013년 2월 20일
Great! A 50 times speedup for me!
Shengtao Wang
Shengtao Wang 2013년 2월 20일
Note this may produce the same number multiple times if they are not unique in the arrays. not a problem at all though.

댓글을 달려면 로그인하십시오.


Matt Fig
Matt Fig 2012년 10월 17일
BinA = B(ismember(B,A));
for n=1:length(BinA)
do-something with BinA(n)
end
  댓글 수: 2
Salvatore Mazzarino
Salvatore Mazzarino 2012년 10월 17일
My B vector is a vector that contains ONLY some element of A vector so I don't see any reasons to do what you 're saying to do.
Matt Fig
Matt Fig 2012년 10월 17일
편집: Matt Fig 2012년 10월 17일
If your B vector contains ONLY elements of A, then why were YOU checking if each element was a member in your code?? That is just weird.
If you know that every element of B is a member of A, then what is the point of your question?? Why not just get rid of the IF statement in your FOR loop altogether??

댓글을 달려면 로그인하십시오.


Azzi Abdelmalek
Azzi Abdelmalek 2012년 10월 17일
편집: Azzi Abdelmalek 2012년 10월 17일
use ismember out of the loop
A=[1 2 3 4 5 6 7 8 9 10]
B=[3 4 11 9 22]
idx=find(ismember(B,A)==1)
for k=idx
%do
end
  댓글 수: 2
Salvatore Mazzarino
Salvatore Mazzarino 2012년 10월 17일
I have modified my code. the for cycle executes A matrix and not B matrix. is the same thing?
Azzi Abdelmalek
Azzi Abdelmalek 2012년 10월 17일
what do you mean?

댓글을 달려면 로그인하십시오.


Robert Cumming
Robert Cumming 2012년 10월 17일
if you want to keep it in the loop you can do:
for n=1:length(B)
if min (abs( A-B(n)) ) == 0;
% do something
end
end;
Or use logical indexing
tic
A=[1 2 3 4 5 6 7 8 9 10];
B=[3 4 11 9 22];
idx=find(ismember(B,A)==1);
toc
tic
flags = false(1,length(B));
for i=1:length(A)
check = B==A(i);
flags(check)=1;
end
idx2 = find(flags==1);
toc
A for loop can be faster!!

Omar Ali Muhammed
Omar Ali Muhammed 2021년 3월 3일
A=[1 2 3 4 5 6 7 8 9 10];
B=[3 4 9];
tt=ismember(B,A);
if sum(tt)==3
Do Something;
else
Do Something;
end

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by