valor posicion extraer elementos correlacion codigo matlab loops replace find

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 son NaN .
  • 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;