El que busca encuentra

Post date: May 27, 2015 9:38:37 AM

El foro de discusión tiene una nueva entrada: una pregunta de Florencia que está resolviendo el desafío nro. 1.5.

La pregunta de Floppy nos da pié para discutir sobre un tipo de funciones muy útiles. Funciones que nos permiten obtener la posición, dentro de un vector, de elementos que cumplen cierta condición lógica. Esto es muy similar a lo que hicimos en la clase ¿Verdadero o falso? cuando buscamos números pares.

Find == Econtrar

Las operaciones lógicas generan matrices con valores verdadero o falso. Así, la siguiente desigualdad

tf = [-1,5,-3] > 0

Genera un vector de valores lógicos (verdadero o falso), en este caso [false,true,false]. Estos vectores lógicos son de muchísima utilidad: nos permiten filtrar matrices o buscar elementos que cumplan ciertas condiciones lógicas. Para realizar lo segundo usamos la función find.

La función find (encontrar, en inglés) nos devuelve la posición de aquellos elementos que corresponden al valor "verdadero". Por ejemplo:

find ([false, true, false])

devuelve un 2, porque el segundo elemento es un valor verdadero. En Octave todo aquello que no es cero o vacío se considera verdadero. Es decir que

find ([0,-3, 0])

también devuelve 2, porque el segundo elemento es el único no cero. Cuando varios elementos son verdaderos, la función find devuelve todas las posiciones correspondientes, es decir

find ([false, true, true])

devuelve [2, 3].

La función también acepta matrices como entradas y nos devuelve el índice lineal de los elementos verdaderos. En Octave las matrices están ordenadas por columnas (en Inglés se dice column-major order), es decir contamos de arriba para abajo y de izquierda a derecha. Por ejemplo en una matriz de 3x4 los indices lineales son

Es decir que si ejecutamos

find ([0 1 0; 0 0 1; 0 1 0])

obtenemos [4,6,8].

Para obtener las filas y columnas de los elementos verdaderos, tenemos que llamar a la función con dos argumentos de salida. Si ejecutamos

[i, j] = find ([0 1 0; 0 0 1; 0 1 0]);
[i,j]
ans =
   1   2
   3   2
   2   3

obtenemos en i las filas y en j las columnas de los valores verdaderos.

¿Es miembro?

Otra función muy útil es ismember (es miembro, en inglés). Esta función toma como entrada dos argumentos y nos dice si los elementos del primero están en el segundo. Solo voy a proveer un corto ejemplo y los invito a que lean la ayuda de la función (en Octave: help ismember) y pongan sus preguntas en el foro de discusión.

Supongamos que queremos saber si la letra "a" está presente en un string

x = "Hay letras a en esta frase?";

podemos ejecutar

tf = ismember ("a", x)
  tf =  1

Claro que sí. La función también se puede usar para obtener la posición de las letras buscadas. Para esto intercambiamos los argumentos de entrada y buscamos el string x en la letra "a".

pos = find (ismember (x,"a"))
  pos =
      2    9   12   20   24

Pregunta 1. ¿Puedes explicar el porqué de este truquillo?

La función ismember también puede darnos la posición de los elementos encontrados, pero cuando el elemento buscado se repite (como en nuestro caso), solo nos devuelve la última ocurrencia

[tf, pos] = ismember ("a", x)
  tf  = 1
  pos = 24

Esta funcionalidad es útil cuando no hay repeticiones y se ilustra mejor con el ejemplo en la ayuda de ismember

a = [3, 10, 1];
s = [0:9];
[tf, pos] = ismember (a, s)
tf = [1, 0, 1]
s_idx = [4, 0, 2]

Las funciones find e ismember son de mucha utilidad y tienen varios otros modos de uso. Lee la ayuda, explora y pregunta en el foro!