vectores valor una posicion matriz matrices filas extraer eliminar elementos datos cambiar almacenar agregar matlab matrix indexing addressing submatrix

una - posicion de un valor en un vector matlab



MATLAB: extraer la submatriz con indexación lógica (3)

Esta es una forma de hacer esto. Se supone que todas las filas de I tienen el mismo número de unidades. También se supone que todas las columnas de I tienen el mismo número, porque Submatrix debe ser rectangular.

%# Define the example data. M = magic(5); I = zeros(5); I(2:3, 2:3) = 1; %# Create the Submatrix. Submatrix = reshape(M(find(I)), max(sum(I)), max(sum(I'')));

Estoy buscando una solución elegante para este problema muy simple en MATLAB. Supongamos que tengo una matriz

>> M = magic(5) M = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9

y una variable lógica de la forma

I = 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0

Si trato de recuperar los elementos de M asociados a 1 valores en I , obtengo un vector de columna

>> M(I) ans = 5 6 7 13

Cuál sería la forma más simple de obtener la matriz [5 7 ; 6 13] [5 7 ; 6 13] de esta indexación lógica?

Si conozco la forma de los elementos distintos de cero de I , puedo usar una nueva forma después de la indexación, pero ese no es un caso general.

Además, soy consciente de que el comportamiento predeterminado para este tipo de indexación en MATLAB impone la coherencia con respecto al caso en el que los valores distintos de cero no forman una matriz, pero me pregunto si hay una solución simple para este particular caso.


M = magic(5); I = [ ... ]; ind = find(I); %# find indices of ones in I [y1, x1] = ind2sub(size(M), ind(1)); %# get top-left position [y2, x2] = ind2sub(size(M), ind(end)); %# get bottom-right position O = M(y1:y2, x1:x2); %# copy submatrix


Aquí hay una solución muy simple:

T = I(any(I''),any(I)); T(:) = M(I);