low speed of 'ismember' function

hi. in my code there is a for loop like the following:
for i=1:n
N=find(~ismember(Vector1,Vector2))
do something...
end
This loop is repeated several thousand times. 'ismember' function is very slow. So that most of the runtime for 'ismember' function lost. Is there any alternative to this?

Réponses (3)

Johan Löfberg
Johan Löfberg le 29 Août 2014

0 votes

If data is sorted, using ismembc could be a quick fix.

2 commentaires

Ehsan
Ehsan le 29 Août 2014
No. This loop used for programming the Traveling Salesman Problem. this vectors is not sorted and can't be like that.
Johan Löfberg
Johan Löfberg le 29 Août 2014
Then I would scratch ismember and do sort+ismembc (ismember contains a lot of overhead. look into it and you will see that it basically does sort+ismembc once all data is checked etc)

Connectez-vous pour commenter.

David Sanchez
David Sanchez le 29 Août 2014

0 votes

Depending on your data, you might try to code your own function avoiding some conditions and calls to sub-functions within the ismember function.
You can take a look at ismember code with:
type ismember
and try to make it easier.

3 commentaires

Ehsan
Ehsan le 29 Août 2014
this is my code:
for k=1:nAnt
ant(k).Tour=randi([1,nCity],1,1);
end
for i=2:nCity
for k=1:nAnt
N=find(~ismember(1:nCity,ant(k).Tour));
% do somthing
end
end
José-Luis
José-Luis le 29 Août 2014
The way you use ismember() seems to be inefficient. You are going to be processing similar things over and over. You could instead loop through the variable of interest, do an exhaustive search, save that somewhere and then %do something based on those results.
Ehsan
Ehsan le 29 Août 2014
I just do not understand. What is your suggestion? Please change the code according to your suggestion.

Connectez-vous pour commenter.

Titus Edelhofer
Titus Edelhofer le 29 Août 2014

0 votes

Hi,
does "Vector1" and "Vector2" changes in every iteration? Often you see something like
for i=1:n
v = ismember(x(i), y);
% do something
end
which can be changed to
vAll = ismember(x, y);
for i=1:n
% now do something with vAll(i)
end
Titus

1 commentaire

Ehsan
Ehsan le 29 Août 2014
this is my code:
for k=1:nAnt
ant(k).Tour=randi([1,nCity],1,1);
end
for i=2:nCity
for k=1:nAnt
N=find(~ismember(1:nCity,ant(k).Tour));
% do somthing
end
end

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Centre d'aide et File Exchange

Produits

Question posée :

le 29 Août 2014

Commenté :

le 29 Août 2014

Community Treasure Hunt

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

Start Hunting!

Translated by