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

¿Cómo seleccionar una submatriz (no en cualquier 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 la 1ª 2da y 9na fila y la 4ta y 6ta columnas?

Gracias por cualquier respuesta útil!

TLDR: respuesta corta

En cuanto a su pregunta, supongamos 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é por ti:

1. Vectores de indexación

Los vectores de indexación indican los índices del elemento que se 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 colon (:):

  • end simplemente indica el último índice en esa dimensión.
  • El colon es solo una notación abreviada 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 al concatenar las columnas en un vector de columna y asignar í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 así b es igual a 40.

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

Indexación lineal con subíndices de matriz : también es posible usar otra matriz para indexación lineal. La matriz de subíndice simplemente se convierte en un vector de columna y se utiliza 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 la reshape(A(I(:)), size(I)) .

Conversión de subíndices de matriz a índices lineales y viceversa : para eso tienes sub2ind e ind2sub , respectivamente. Por ejemplo, si quiere 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 ser ser 7, por supuesto).

3. Indizació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. El vector de subíndice debe ser de 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]) usando 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 hay un vector unidimensional y, si es necesario, debe volver a formarse en una matriz (por ejemplo, utilizando la reshape ).

Dejame explicarte con un ejemplo:

Vamos a definir una matriz de 6×6

 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 

De esta matriz, quiere 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 i- ésima fila y la j- ésima columna eliminadas.