Main Content

Buscar los elementos de un arreglo que cumplen una condición

Este ejemplo muestra cómo filtrar los elementos de un arreglo aplicando condiciones a este. Por ejemplo, puede examinar los elementos pares de una matriz, buscar la ubicación de todos los ceros de un arreglo multidimensional o reemplazar valores NaN en los datos. Puede realizar estas tareas usando una combinación de operadores relacionales y lógicos. Los operadores relacionales (>, <, >=, <=, ==, ~=) imponen condiciones en el arreglo. Puede aplicar varias condiciones conectándolos con los operadores lógicos and, or y not, respectivamente indicados por los símbolos &, | y ~.

Aplicar una condición única

Para aplicar una condición única, empiece creando una matriz de 5 por 5 que contenga enteros aleatorios entre 1 y 15. Restablezca el generador de números aleatorios al estado predeterminado para poder reproducirlos.

rng default
A = randi(15,5)
A = 5×5

    13     2     3     3    10
    14     5    15     7     1
     2     9    15    14    13
    14    15     8    12    15
    10    15    13    15    11

Utilice el operador relacional menor que, <, para determinar qué elementos de A son menores que 9. Guarde el resultado en B.

B = A < 9
B = 5x5 logical array

   0   1   1   1   0
   0   1   0   1   1
   1   0   0   0   0
   0   0   1   0   0
   0   0   0   0   0

El resultado es una matriz lógica. Cada valor de B representa un estado lógico 1 (true) o 0 (false) para indicar si el elemento correspondiente de A cumple la condición A < 9. Por ejemplo, A(1,1) es 13, entonces B(1,1) es 0 (false) lógico. Sin embargo, A(1,2) es 2, entonces B(1,2) es 1 (true) lógico.

Aunque B contiene información acerca de qué elementos de A son menores que 9, no indica cuáles son sus valores. En lugar de comparar las matrices elemento a elemento, puede utilizar B para indexar en A.

A(B)
ans = 8×1

     2
     2
     5
     3
     8
     3
     7
     1

El resultado es un vector columna de los elementos de A que son menores que 9. Como B es una matriz lógica, esta operación se llama indexación lógica. En este caso, el arreglo lógico que se está usando como índice es del mismo tamaño que el otro arreglo, aunque no es un requisito indispensable. Para obtener más información, consulte Indexación de arreglos.

Algunos problemas requieren información acerca de las ubicaciones de los elementos del arreglo que cumplen las condiciones en lugar de sus valores reales. En este ejemplo, puede usar la función find para encontrar todos los elementos de A menores que 9.

I = find(A < 9)
I = 8×1

     3
     6
     7
    11
    14
    16
    17
    22

El resultado es un vector columna de índices lineales. Cada índice describe la ubicación de un elemento de A que es menor que 9, por lo que, en la práctica, A(I) devuelve el mismo resultado que A(B). La diferencia es que A(B) usa la indexación lógica, mientras que A(I) utiliza la indexación lineal.

Aplicar varias condiciones

Puede utilizar operadores lógicos and, or y not para aplicar cualquier cantidad de condiciones a un arreglo; el número de condiciones no se limita a uno o dos.

En primer lugar, utilice el operador lógico and, indicado como &, para especificar dos condiciones: los elementos tienen que ser menores que 9 y mayores que 2. Especifique las condiciones como índice lógico para ver los elementos que cumplen ambas condiciones.

A(A<9 & A>2)
ans = 5×1

     5
     3
     8
     3
     7

El resultado es una lista de los elementos de A que cumplen ambas condiciones. Asegúrese de especificar cada condición con una instrucción independiente conectada por un operador lógico. Por ejemplo, no puede especificar las condiciones anteriores por A(2<A<9), puesto que se evalúa en A(2<A | A<9).

A continuación, busque los elementos de A que sean menores que 9 y numerados pares.

A(A<9 & ~mod(A,2))
ans = 3×1

     2
     2
     8

El resultado es una lista de todos los elementos pares de A que sean menores que 9. El uso del operador lógico NOT, ~, convierte la matriz mod(A,2) en una matriz lógica, con un valor de 1 (true) lógico ubicado donde un elemento se puede dividir entre 2.

Por último, busque los elementos de A que sean menores que 9, numerados pares y no iguales a 2.

A(A<9 & ~mod(A,2) & A~=2)
ans = 8

El resultado es 8, par, menor que 9 y no igual a 2. Es el único elemento de A que cumple las tres condiciones.

Utilice la función find para obtener el índice del elemento igual a 8 que cumple las condiciones.

find(A<9 & ~mod(A,2) & A~=2)
ans = 14

El resultado indica que A(14) = 8.

Reemplazar valores que cumplen una condición

A veces resulta útil cambiar simultáneamente los valores de varios elementos de arreglos existentes. Utilice la indexación lógica con una instrucción de asignación simple para reemplazar los valores de un arreglo que cumplen la condición.

Reemplace todos los valores de A que sean mayores que 10 por el número 10.

A(A>10) = 10
A = 5×5

    10     2     3     3    10
    10     5    10     7     1
     2     9    10    10    10
    10    10     8    10    10
    10    10    10    10    10

A continuación, reemplace todos los valores de A que no sean iguales a 10 por un valor NaN.

A(A~=10) = NaN
A = 5×5

    10   NaN   NaN   NaN    10
    10   NaN    10   NaN   NaN
   NaN   NaN    10    10    10
    10    10   NaN    10    10
    10    10    10    10    10

Por último, reemplace todos los valores NaN de A por ceros y aplique el operador lógico NOT, ~A.

A(isnan(A)) = 0;
C = ~A
C = 5x5 logical array

   0   1   1   1   0
   0   1   0   1   1
   1   1   0   0   0
   0   0   1   0   0
   0   0   0   0   0

La matriz resultante tiene valores de 1 (true) lógicos en lugar de los valores NaN, y 0 (false) lógico en lugar de dieces. La operación lógica NOT, ~A, convierte el arreglo numérico en un arreglo lógico de forma que A&C devuelve una matriz de valores lógicos 0 (false) y A|C devuelve una matriz de valores lógicos 1 (true).

Consulte también

| | | | | | |