Finding the indices of the elements of one array in another
Afficher commentaires plus anciens
Given two vectors A and B, find the index, idx into A of the element of B so that
A(idx)=B.
Now I know there must be many ways it can be done, but is there a one-liner?
For example if
A=[3 4 5 6 7];
B=[6 4 7];
then
[tf,loc]=ismember(A,B);
idx=[1:length(A)];
idx=idx(tf);
idx=idx(loc(tf));
disp(A(idx))
will do it but that is four steps. Is there a more elegant way?
3 commentaires
Alan
le 3 Déc 2011
Philip
le 26 Sep 2014
MATLAB supports logical indexing. No need to use "find":
A = A( ismember( A, B ) );
Leandro Coelho
le 1 Juil 2016
Another option: intersect(A,B)
Réponse acceptée
Plus de réponses (6)
Alan
le 3 Déc 2011
3 commentaires
Sven
le 4 Déc 2011
Alan, well done in asking a question clearly (with code), and in particular taking the time to give feedback on the results above
Iftikhar Ali
le 18 Oct 2015
Method 3 has solved my problem, thanks.
David
le 18 Jan 2020
Method one also works if there are multiple occurences of B in A. Intersect fails in this case.
Alan
le 6 Déc 2011
2 commentaires
normanius
le 9 Oct 2017
This is by far the best answer!
John Sogade
le 2 Jan 2020
obviously this will fail to get A(idx), if any elements of idx are 0 (i.e. B not in A) and robust usage should be clarified to A(idx(idx ~= 0)).
Iftikhar Ali
le 18 Oct 2015
1 vote
I am facing an issue finding indices of element matching in two arrays.
xpts = [0 0.0004 0.0011 0.0018 0.0025 0.003]; x = 0:0.0001:0.003; index1 = find(ismember(x, xpts));
It returns index1 = [1 5 12 26 31]
but there is one more element '0.0018' in x which also belongs xpts, and not including in the answer.
Similarly when I increase the number of points in x, there are few elements that are missed or not recognized by the find command. What's going wrong here.
Teja Muppirala
le 3 Déc 2011
If A is sorted, then I think this is probably the easiest (and also fastest?) way to do it.
[~,idx] = histc(B,A)
If A is not sorted, then:
[As,s_idx] = sort(A);
[~,tmp] = histc(B,As);
idx = s_idx(tmp)
Stephen Politzer-Ahles
le 8 Juil 2014
Modifié(e) : Stephen Politzer-Ahles
le 8 Juil 2014
The following should also work for your situation, and just needs one line:
A=[3 4 5 6 7];
B=[6 4 7];
idx = arrayfun( @(x)( find(A==x) ), B );
Junhong YE
le 21 Juil 2014
0 votes
I think find(ismember(A,B)) would do it.
Catégories
En savoir plus sur Logical dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!