I have an array a = [1 5 2 5 3 5 4 5]. I have a second array b = [2,3,4].
I want to type something like c = find(a == b), but Matlab doesn't like it that the dimensions don't agree. The answer I am looking for is c = [3,5,7].
I know I could do it with a for loop. Trying to avoid a for loop for speed concerns. Any help would be appreciated.

 Réponse acceptée

Image Analyst
Image Analyst le 20 Mar 2012

31 votes

Use ismember:
a = [1 5 2 5 3 5 4 5]
b = [2,3,4]
% Give "true" if the element in "a" is a member of "b".
c = ismember(a, b)
% Extract the elements of a at those indexes.
indexes = find(c)
Results:
a =
1 5 2 5 3 5 4 5
b =
2 3 4
c =
0 0 1 0 1 0 1 0
indexes =
3 5 7
Obviously you can do away with "c" if you want, and just have a one-liner. I did it in two steps just for tutorial purposes.

5 commentaires

Edward Umpfenbach
Edward Umpfenbach le 20 Mar 2012
Perfect. Thanks.
Yu
Yu le 12 Juin 2014
what if the number in a is unique, e.g a=[1,2,3,4,5,6,7,8,9], and b=[2,3,3] then, i would like to know the location of the numbers of b in a, according to you algorithm, the result will be [2,3], but i actuall would like to have the result of [2,3,3], since there are two 3 in b.
Any suggestion?
In your example, if 5 is included in b, the result is unacceptable as well. the ans will be : 2 3 4 5 6 7 8
hwo to improve?
Supraj Akileti
Supraj Akileti le 4 Mai 2016
I have a follow up on this. What if the number is a = [1 5 2 5 3 5 4 2 5] and b = [5,2,4]. Acc to the above algorithm the index would be [2 3 4 6 7 8 9] but I actually would like to have the result [2,4,6,9,3,8,7]. Any suggestions?
Supraj:
Try this:
a = [1 5 2 5 3 5 4 2 5]
b = [5,2,4]
output = [];
for k = 1 : length(b)
output = [output, find(a == b(k))]
end
Shlomo Geva
Shlomo Geva le 2 Déc 2020
Modifié(e) : Shlomo Geva le 2 Déc 2020
Without an explicit loop (a bit convoluted, sorry, just having fun, 8 years too late)
a = [1 5 2 5 3 5 4 2 5];
b = [5,2,4];
[~,Locb]=ismember(a,b);
[s,si]=sort(Locb);
out=si(s>0)
out =
2 4 6 9 3 8 7
>>

Connectez-vous pour commenter.

Plus de réponses (2)

Jos (10584)
Jos (10584) le 12 Juin 2014

12 votes

Use the second output of ismember:
a = [4 3 1 2 5]
b = [2 3 3]
[tf, loc] = ismember(b,a)
% loc is [ 4 2 2] as required
Shlomo Geva
Shlomo Geva le 2 Déc 2020
Modifié(e) : Shlomo Geva le 2 Déc 2020

0 votes

function out = findMultipleElements(a,b)
% Find multiple elements in an array
% example:
% a = [1 5 2 5 3 5 4 2 5]
% b = [5,2,4]
% result = [2,4,6,9,3,8,7] % the indexes in a of elements from b, in order
% % The convoluted (obfuscated) solution.
[~,Locb]=ismember(a,b);
[s,si]=sort(Locb);
out=si(s>0);
% % The straight shooter solution.
% out = [];
% for n = 1:length(b)
% out = [out,find(a==b(n))]
% end
end

Catégories

En savoir plus sur Matrices and Arrays dans Centre d'aide et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by