with remove isnan from eliminar delete columns matlab matrix nan

isnan - matlab remove nan from vector



¿Hay alguna forma general de eliminar NaNs de una matriz? (5)

Fácil:

A=[1 2; nan 4]; A(isnan(A))=0;

¿Hay alguna forma general de eliminar NaNs de una matriz? A veces me encuentro con este problema en medio de un código y luego crea problemas para obtener resultados apropiados. ¿Hay alguna manera de generar cualquier tipo de control para evitar NaN que surgen en un código MATLAB? Será realmente útil si alguien puede darme amablemente un ejemplo con alguna idea relacionada con él.


Hay varias funciones que funcionan con NaNs : isnan , nanmean , max() y min() también tienen un indicador NaN ( ''omitnan'' ) si desea incluir NaNs en la evaluación mínima o máxima.

Aunque debe prestar atención: a veces los NaNs pueden ser generados por su código (por ejemplo, 0/0 o también cuando se realiza la estandarización (x-mean(x))/std(x) si x contiene 1 valor o varios pero igual valores).


No puede evitar NaN dado que algunos cálculos lo producen como resultado. Por ejemplo, si calcula de 1/0-1/0 obtendrá NaN . Debería tratar con NaN en el nivel de código, usando funciones isnan como isnan .


Puedes detectar valores nan con la función isnan :

A = [1 NaN 3]; A(~isnan(A)) 1 3

Esto realmente elimina los valores de nan, sin embargo, esto no siempre es posible, por ejemplo

A = [1 nan; 2 3]; A(~isnan(A)) 1 2 3

como puedes ver, esto destruye la estructura de la matriz. Puede evitar esto haciendo una preasignación primero y, por lo tanto, estableciendo los valores nan en cero:

B = zeros(size(A)); B(~isnan(A))=A(~isnan(A)) B = 1 0 2 3

o, sobreescribiendo nuestra matriz original A

A(isnan(A))=0 A = 1 0 2 3


Varias situaciones que surgen con una matriz A contiene valores de NaN:

(1) Construya una nueva matriz donde se eliminen todas las filas con un NaN.

row_mask = ~any(isnan(A),2); A_nonans = A(row_mask,:);

(2) Construya una nueva matriz donde se eliminen todas las columnas con un NaN.

column_mask = ~any(isnan(A),1); A_nonans = A(:, column_mask);

(3) Construya una nueva matriz donde todas las entradas de NaN se reemplazan por 0.

A_nans_replaced = A; A_nans_replaced(isnan(A_nans_replaced)) = 0;