sub2ind logical index create array matlab matrix matrix-indexing

logical - Cómo seleccionar una submatriz(no en un patrón en particular) en Matlab



sub2ind matlab (3)

¿Cómo seleccionar una submatriz (no en ningún patrón) en Matlab? Por ejemplo, para una matriz de tamaño 10 por 10, ¿cómo seleccionar la submatriz que consiste en la intersección de las filas 1ª y 9ª y las columnas 4ª y 6ª?

Gracias por cualquier respuesta útil!


TLDR: Respuesta corta

En cuanto a su pregunta, suponga que tiene una matriz A 10 por 10 arbitraria. La forma más sencilla de extraer la submatriz deseada sería con un vector de índice:

B = A([1 2 9], [4 6]);


Indexación en MATLAB

Hay un artículo interesante en la documentación oficial que explica exhaustivamente la indexación en MATLAB. Básicamente, hay varias formas de extraer un subconjunto de valores, los resumiré para usted:

1. Indización de vectores

Los vectores de indexación indican los índices del elemento a extraer. Pueden contener un solo índice o varios, así:

A = [10 20 30 40 50 60 70 80 90] %# Extracts the third and the ninth element B = A([3 9]) %# B = [30 90]

Los vectores de indexación se pueden especificar para cada dimensión por separado, por ejemplo:

A = [10 20 30; 40 50 60; 70 80 90]; %# Extract the first and third rows, and the first and second columns B = A([1 3], [1 2]) %# B = [10 30; 40 60]

También hay dos subíndices especiales: end y dos puntos (:):

  • end simplemente indica el último índice en esa dimensión.
  • El colon es solo una notación corta para "1: end".

Por ejemplo, en lugar de escribir A([1 2 3], [2 3]) , puede escribir A(:, 2:end) . Esto es especialmente útil para matrices grandes.

2. Indización lineal

La indexación lineal trata cualquier matriz como si fuera un vector de columna concatenando las columnas en un vector de columna y asignando índices a los elementos respectivamente. Por ejemplo, tenemos:

A = [10 20 30; 40 50 60; 70 80 90];

y queremos calcular b = A(2) . El vector de columna equivalente es:

A = [10; 40; 70; 20; 50; 80; 30; 60; 90]

y entonces b es igual a 40.

Los subíndices especiales de dos puntos y end también están permitidos, por supuesto. Por esa razón, A(:) convierte cualquier matriz A en un vector de columna.

Indización lineal con subíndices de matriz : también es posible utilizar otra matriz para la indexación lineal. La matriz de subíndices se convierte simplemente en un vector de columna y se usa para la indexación lineal. La matriz resultante es, sin embargo, siempre de las mismas dimensiones que la matriz de subíndices.
Por ejemplo, si I = [1 3; 1 2] I = [1 3; 1 2] , entonces A(I) es lo mismo que escribir reshape(A(I(:)), size(I)) .

Conversión de subíndices matriciales a índices lineales y viceversa : para eso tiene sub2ind e ind2sub , respectivamente. Por ejemplo, si desea convertir los subíndices [1, 3] en la matriz A (correspondiente al elemento 30) en un índice lineal, puede escribir sub2ind(size(A), 1, 3) (el resultado en este caso debería tener 7 años, por supuesto).

3. Indexación lógica

En la indexación lógica, los subíndices son binarios, donde un 1 lógico indica que el elemento correspondiente está seleccionado, y 0 significa que no lo está. El vector de subíndices debe tener las mismas dimensiones que la matriz original o un vector con el mismo número de elementos. Por ejemplo, si tenemos:

A = [10 20 30; 40 50 60; 70 80 90];

y queremos extraer A([1 3], [1 2]) mediante la indexación lógica, podemos hacer esto:

Ir = logical([1 1 0]); Ic = logical([1 0 1]); B = A(Ir, Ic)

o esto:

I = logical([1 0 1; 1 0 1; 0 0 0]); B = A(I)

o esto:

I = logical([1 1 0 0 0 0 1 1 0]); B = A(I)

Tenga en cuenta que, en los dos últimos casos, es un vector unidimensional y, si es necesario, debe volver a formarse en una matriz (por ejemplo, utilizando la reshape ).


Dejame explicarte con un ejemplo:

Definamos una matriz de 6x6.

A = magic(6) A = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11

Desde esta matriz desea que los elementos en las filas 1, 2 y 5, y en las columnas 4 y 6

B = A([1 2 5],[4 6]) B = 26 24 21 25 12 16

Espero que esto ayude.


function f = sub(A,i,j) [m,n] = size(A); row = 1:m; col = 1:n; x = row; x(i) = []; y=col; y(j) = []; f= A(x,y);

Devuelve la matriz A, con la fila i th y la columna j th eliminadas.