variable unir una numeros matriz matrices listas letras leer imprimir dinamicos con caracter arreglos arrays matlab matrix matrix-indexing

arrays - unir - Indexación lineal, indexación lógica y todo eso



unir matrices matlab (1)

Estamos acostumbrados a diferentes formas de indexación en Matlab:

  • estándar (usando números enteros a lo largo de cada dimensión),
  • lógico (usando valores lógicos),
  • lineal (usando un solo índice para atravesar una matriz con más de una dimensión).

A primera vista, puede parecer que estas formas son exclusivas: un índice es estándar, o lógico, o lineal. Sin embargo, a veces parece haber una mezcla entre varias de estas formas. Por ejemplo,

>> A = magic(3) A = 8 1 6 3 5 7 4 9 2 >> A(A>5) ans = 8 9 6 7

Esto es una indexación lógica, ¿verdad? Pero también tiene algunas características de indexación lineal, porque se devuelve un vector de columna. De hecho, el índice lógico A>5 tiene el mismo efecto que el índice lineal find(A>5) .

Como segundo ejemplo, considere

>> A = magic(3) A = 8 1 6 3 5 7 4 9 2 >> A(1:2, [true false true]) ans = 8 6 3 7

En esta expresión, la indexación estándar (con valores enteros) se usa para la primera coordenada, y la indexación lógica se usa para la segunda.

Estos ejemplos (y los más complicados que surgen en la práctica) plantean las siguientes preguntas:

  • ¿Qué tipos de indexación hay en Matlab?
  • ¿Cómo pueden combinarse?
  • ¿Cómo deberían ser referidos?

A continuación, uso la terminología que creo que está más o menos en línea con la práctica estándar de Matlab. Sin embargo, en algunos casos, he tenido que ordenar, crear un nombre porque no tenía conocimiento de uno existente. Por favor, avíseme si hay más nombres estándar que los que estoy usando.

Esta respuesta intenta aclarar los diferentes tipos de indexación y cómo se pueden combinar. Una pregunta diferente es cómo se determina la forma ( size ) de la matriz de salida como una función de la forma de las variables de índice. Una buena publicación sobre esto es Essence of indexing de Loren Shure.

La descripción a seguir se centra en la indexación de matrices numéricas , pero se puede aplicar a matrices de celdas con paréntesis o indexación de llaves, con el cambio obvio del tipo de salida (matriz de celdas o lista separada por comas, respectivamente). Esto será discutido brevemente al final.

Tipos de indexación en matrices numéricas

La indexación puede clasificarse teniendo en cuenta los dos atributos siguientes.

  1. Según el número de dimensiones a las que se refiere cada variable de índice, la indexación puede ser multidimensional o lineal. Pero estos son solo dos casos extremos. Existe una situación intermedia, que puede denominarse indización parcialmente lineal:

    • La indización multidimensional pura especifica una variable de índice para cada dimensión de la matriz. Los índices individuales a veces se denominan subíndices en la documentación de Matlab (consulte, por ejemplo, sub2ind ).
    • La indexación lineal pura especifica una sola variable de índice que atraviesa la matriz en todas las dimensiones (esto se puede ver como si todas las dimensiones colapsasen en una). Como sabemos, la travesía se realiza primero a lo largo de las columnas, luego a lo largo de las filas, luego a lo largo de las divisiones en tercer tercio, etc. (el llamado orden de columnas principales ).
    • Indización parcialmente lineal : dada una matriz con m+n dimensiones, n>=2 , se pueden especificar m variables de índice para las primeras m dimensiones (utilizando así la indexación multidimensional en esas dimensiones) y una variable de índice para las últimas n dimensiones, que es interpretado como un índice lineal solo para esas dimensiones (las últimas n dimensiones se colapsan en una).
  2. De acuerdo con el tipo de valores de índice, cada variable de índice puede ser de valor entero o lógica:

    • Se trata de un valor entero si la variable de índice contiene números enteros positivos;
    • Es lógico si la variable de índice contiene valores lógicos.

Los criterios de clasificación 1 y 2 son independientes . La categoría del índice desde el punto de vista del criterio 1 no tiene relación con su categoría de acuerdo con el criterio 2. Todas las combinaciones son posibles.

Por lo tanto, de acuerdo con la clasificación anterior, hay 6 tipos básicos de indexación. Para aclarar, siguiente es un ejemplo para cada uno. Todos los ejemplos usan la matriz A = cat(3, magic(3), 9+magic(3)) , es decir,

A(:,:,1) = 8 1 6 3 5 7 4 9 2 A(:,:,2) = 17 10 15 12 14 16 13 18 11

  1. Multidimensional, de valor entero:

    >> A([1 2], 2, 2) ans = 10 14

  2. Lineal, de valor entero:

    >> A([2 5:7]) ans = 3 5 9 6

  3. Parcialmente lineal, de valor entero:

    >> A([1 2], 2:4) ans = 1 6 17 5 7 12

  4. Multidimensional, lógico:

    >> A([true true false], [false true false], [false true]) ans = 10 14

    Curiosamente, el número de valores lógicos puede ser más pequeño, o incluso mayor, que el tamaño en la dimensión a la que se refiere el índice:

    >> A([true true], [false true false false], [false true]) ans = 10 14

    Los valores faltantes se interpretan como false , y los valores excedentes deben ser false o se producirá un error. Ver, por ejemplo, esta página de Mathworks o esta respuesta de Jonas .

  5. Lineal, lógico:

    >> A([false true false false true true true]) ans = 3 5 9 6

    (Tenga en cuenta que 11 valores finales false se han omitido en el vector de indexación).

  6. Parcialmente lineal, lógico:

    >> A([true true false], [false true true true false false]) ans = 1 6 17 5 7 12

En la indexación multidimensional o parcialmente lineal, en la que hay más de una variable de índice, cada una de ellas puede ser independiente o lógica. Esto da lugar a diferentes tipos mixtos . Por ejemplo:

  1. Multidimensional, lógico / de valor entero:

    >> A([true false true], [false true true], 2) ans = 10 15 18 11

  2. Parcialmente lineal, de valor entero / lógico:

    >> A([1 2], [true false true false true false]) ans = 8 6 10 3 7 14

Si la matriz que se está indexando es una matriz dispersa, todo lo anterior aún se aplica, excepto que la indexación parcialmente lineal no existe para las matrices; y, por supuesto, el resultado también es escaso.

Indexación de matrices de celdas

Todos los tipos de indexación descritos para matrices numéricas se pueden aplicar a matrices de celdas, con una consideración adicional. Los arreglos de celdas se pueden indexar con paréntesis o con llaves. En el primer caso, el resultado de la indexación es una matriz de celdas. En el segundo, es una lista separada por comas del contenido de la celda.

Como ejemplo, supongamos que la matriz numérica utilizada en los ejemplos anteriores se transforma en la matriz de celdas C = num2cell(A) , es decir,

C(:,:,1) = [8] [1] [6] [3] [5] [7] [4] [9] [2] C(:,:,2) = [17] [10] [15] [12] [14] [16] [13] [18] [11]

Entonces, la indexación utilizada en el ejemplo 8 anterior produciría la matriz de células

>> C([1 2], [true false true false true false]) ans = [8] [6] [10] [3] [7] [14]

mientras que el uso de llaves produciría la lista separada por comas

>> C{[1 2], [true false true false true false]} ans = 8 ans = 3 ans = 6 ans = 7 ans = 10 ans = 14

Mensaje para llevar / TL; DR

La indexación lógica y lineal no son tipos exclusivos de indexación. Más bien, son dos características independientes de indexación. "Lógico" se refiere al tipo de valores de índice, y "lineal" indica que varias dimensiones están siendo colapsadas e indexadas como una sola. Ambas características pueden suceder simultáneamente.