2011-03-03 34 views
8

puedo buscar la posición de un valor, es decir 45, en un vector de 'datos' con el operador '==' y ') de encontrar (' función:Octave/Matlab: vectorising '==' operator?

data = [ 71 65 23 45 34 12 21 34 52 ]; 
value = 45; 

find (data == value) 
ans = 4 

¿Hay una manera de hacerlo el mismo para varios valores sin necesidad de utilizar un bucle, es decir, me gustaría obtener [4 5 7] en una sola llamada:

values = [ 45 34 21 ]; 
find (data == values) 
error: mx_el_eq: nonconformant arguments (op1 is 1x9, op2 is 1x3) 
error: evaluating argument list element number 1 
error: evaluating argument list element number 1 

Respuesta

14

Pruebe la función ismember:

data = [ 71 65 23 45 34 12 21 34 52 ]; 
values = [ 45 34 21 ]; 

find(ismember(data, values)) 

Dando:

+1

De hecho, esto es mucho más rápido que un método que estaba a punto de proponer: 'find (any (bsxfun (@eq, data, values ​​'), 1))'. usando 'tic'' toc' Obtengo que 'ismember' es x5 veces ** más rápido ** que mi método' bsxfun @ eq'. ¡Bien hecho Bill! – Shai