Find elements of an array in another array

65 visualizaciones (últimos 30 días)
Alexandru
Alexandru el 20 de Sept. de 2013
Hello,
Let's say I have 2 arrays of double, call then A and B. If both have unique entries and I want to find the position of each element of A in array B I can do:
[~, pos] = ismember(A,B);
What if the elements of A show up multiple times in B and I want to get the first time they show up or the last time they show up? I know I can do
pos = zeros(length(A),1);
for k = 1:length(A)
pos(k) = find(B == A(k),1,'first');
end;
But is there a better, more efficient way of doing it? For loops are not exactly in the spirit of Matlab as far as I know.
Thanks, Alex
  1 comentario
Azzi Abdelmalek
Azzi Abdelmalek el 20 de Sept. de 2013
If
a=[1 2 3 4 5 6 7]
b=[12 13 2 4 3 2 4 2 25]
what is the expected result?

Iniciar sesión para comentar.

Respuesta aceptada

Azzi Abdelmalek
Azzi Abdelmalek el 20 de Sept. de 2013
Editada: Azzi Abdelmalek el 20 de Sept. de 2013
Maybe in your case, all element in A are present in B
A=[1 2 3 4 5 6 7]
B=[12 13 2 4 3 2 4 2 25 1 6 7 5]
pos=arrayfun(@(x) find(B==x,1),A)
  2 comentarios
Alexandru
Alexandru el 20 de Sept. de 2013
Thanks Azzi! If I do find(B==x,1,'first') or find(B==x,1,'last') in your code I get exactly what I want.
One more question. Suppose I want to get the second occurrence when it exists. So for the second element of A which is 2 the positions it shows in B are 3, 6 and 8. Suppose I want the code to return 6. How would I modify it?
Azzi Abdelmalek
Azzi Abdelmalek el 20 de Sept. de 2013
Editada: Azzi Abdelmalek el 20 de Sept. de 2013
Use in the loop
id=find(B==A(k),2)
id=id(2)

Iniciar sesión para comentar.

Más respuestas (1)

Azzi Abdelmalek
Azzi Abdelmalek el 20 de Sept. de 2013
Editada: Azzi Abdelmalek el 20 de Sept. de 2013
I prefer this one. It should be much faster
A=[1 2 3 4 5 6 7]
B=[12 13 2 4 3 2 4 2 25 1 6 7 5];
[ii,jj]=unique(B,'stable');
n=numel(A);
pos = zeros(n,1);
for k = 1:n
pos(k)=jj(find(ii == A(k)));
end;
  2 comentarios
Alexandru
Alexandru el 20 de Sept. de 2013
Ok, so in this case it would come down to a for loop.
Thanks again!
Azzi Abdelmalek
Azzi Abdelmalek el 20 de Sept. de 2013
Editada: Azzi Abdelmalek el 20 de Sept. de 2013
This answer is more efficient then the first one

Iniciar sesión para comentar.

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by