Matlab - Eliminar NaNs de una matriz

 
Vista:

Eliminar NaNs de una matriz

Publicado por Maria (16 intervenciones) el 31/07/2018 22:19:31
Hola a todos!

Tengo la siguiente consulta.. Tengo una matriz de 13 columnas y 117936 filas. En una de esas columnas se crean valores NaN, que quiero eliminar. Pero quisiera eliminar no sólo el valor, si no la fila completa, ya que si el resultado es NaN ya no me interesa ninguna columna de la fila. Cómo podría hacerlo para crear una matriz nueva que sólo me presente las filas en las que en la columna 13 no haya valores de NaN?

Muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Daniel
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Eliminar NaNs de una matriz

Publicado por Daniel (264 intervenciones) el 01/08/2018 18:23:26
Te paso un código explicado para que veas cual se la lógica:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
% creo una matriz de prueba de N filas y 13 columnas que coniene algunos
% datos NaN (elegi N=40 para probar)
N=40;
matriz=randi(20,N,13);
matriz(matriz>19)=NaN;
matriz=50+matriz;
 
 
% muestro la matriz (en azul estan los datos NaN)
subplot(1,3,1)
image(matriz)
title([num2str(N) ' filas con ' num2str(sum(sum(isnan(matriz)))) ' valores NaN' ])
% voy a generar alguna condicion logica que me diga cuando una fila tiene
% un NaN
% se que cuando sumo numeros el resultado es un numero
% se que cuando sumo numeros + NaN el resultado es NaN
% genero una matriz de 1 columna y N filas con la suma de cada fila
 
suma=sum(matriz,2);
% muestro la matriz suma (en azul estan los datos NaN)
subplot(1,3,2)
 
image(suma)
title([num2str(sum(sum(isnan(suma)))) ' filas con NaN'])
% genero una condicion logica sobre la suma 1 cuando no sea NaN y 0 cuando
% sea NaN ("isnan" es una funcion que devuelve 1 cuando es NaN y 0 cuando no)
% es justo al reves de lo que necesito por eso uso el negado (el simbolo ~))
logica=~isnan(suma);
% defino una nueva matriz toma solo las filas en donde logica vale 1 y todas las columnas (:))
nueva_matriz=matriz(logica,:);
 
% muestro la nueva matriz (en azul estarian los datos NaN, que no estan mas)
subplot(1,3,3)
image(nueva_matriz)
title([num2str(size(nueva_matriz,1)) ' filas sin NaN'])


Para implementarlo sin tantas vueltas y gráficos en tu código deberias poner solo:

1
nueva_matriz=matriz(~isnan(sum(matriz,2)),:);


Comentanos como te fue

Saludos

Daniel

PD: Este código no es exactamente lo que vos preguntaste (aunque funciona bien) ya que este código busca valores NaN en todas las columnas. Si solo es una columna (por ejemplo la 8) en donde pueden aparecer los valores NaN podrías también usar algo asi

1
nueva_matriz=matriz(~isnan(matriz(:,8)),:);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar NaNs de una matriz

Publicado por Maria (16 intervenciones) el 01/08/2018 20:03:26
Hola Daniel,

muchas gracias por tu respuesta. Ayer escribí la solución, ya que después de escribir la pregunta, me topé con la solución sin esperarlo, pero parece que mi mensaje no se ha guardado.

Encontré esta opción:
B= A(all(~isnan(A),2),:); % for nan - rows

Realmente no tengo una matriz, si no una "quasi" matriz generada por vectores. Pero con el código que he puesto arriba, funciona.

En cualquier caso probaré también tu solución, por si para mi caso también funcionara.

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar