posicion - Reemplazando los valores más cercanos a Nan con un valor, dentro de una matriz, en Matlab
extraer elementos de un vector matlab (2)
Es posible sin definir ningún bucle explícito. A continuación se muestran los pasos y el código de muestra.
- Use la función de
find
para determinar qué elementos sonNaN
. - Luego, compense esos índices por 1 tanto en la dirección positiva como negativa para encontrar posiciones de elementos vecinos.
- Finalmente, reemplace todas las ubicaciones con el valor requerido, después de eliminar aquellas posiciones que están fuera de la matriz.
Código de muestra
% Row and column indices of NaN in array `a`
[x, y] = find(isnan(a));
% All 4-neighbor elements around each NaN
r = [x-1 x+1 x x];
c = [y y y-1 y+1];
% Delete those values that are outside the array bounds
% (For NaNs in the edges)
outInd = r < 1 | r > size(a, 1) | c < 1 | c > size(a, 2);
r(outInd) = [];
c(outInd) = [];
% Replace all these neighbors with required value
a(sub2ind(size(a), r, c)) = 2010;
Soy nuevo en Matlab y tengo una matriz:
M =[NaN NaN NaN 2010 5454;
NaN NaN 2009 3000 5000
NaN 2011 3256 5454 6000
2009 4000 5666 6545 5555
5000 5666 6000 7000 8000];
Quiero reemplazar los valores más cercanos a Nan con un valor de 2010. Sé cómo hacerlo manualmente y uno por uno. ¿Hay alguno para crear un bucle para encontrar estos valores y reemplazarlos? El resultado debería verse así:
M =[NaN NaN NaN 2010 5454;
NaN NaN 2010 3000 5000
NaN 2010 3256 5454 6000
2010 4000 5666 6545 5555
5000 5666 6000 7000 8000];
Gracias de antemano.
Gracias a @crazyGamer por mejorar la respuesta con explicaciones y nombres de variable más claros.
Puede usar convolución 2D para detectar entradas que están cerca de un NaN
; seleccione non- NaN
''s entre esas entradas, y escriba allí el valor deseado.
La cercanía se define por medio de una máscara binaria de barrio. Esto generalmente tiene 4
vecinos (arriba, abajo, izquierda, derecha) u 8
(incluidas las diagonales).
El código se generaliza para usar cualquiera de las máscaras según la opción.
Solución
% Data:
M = [ NaN NaN NaN 2010 5454;
NaN NaN 2009 3000 5000;
NaN 2011 3256 5454 6000;
2009 4000 5666 6545 5555;
5000 5666 6000 7000 8000 ];
neighbourhood = [0 1 0; 1 0 1; 0 1 0];
% or [1 1 1; 1 0 1; 1 1 1] for 8-neighbours
new_value = 2010;
% Computations:
nanInds = isnan(M);
nanIndsWithNeighs = conv2(nanInds, neighbourhood, ''same'')~=0;
neighInds = ~nanInds & nanIndsWithNeighs; % logical AND
M(neighInds) = new_value;