2012-08-10 20 views
7

supongamos que tengo la siguiente matriz:encontrar valores NaN es matriz de células

a = {1; 'abc'; NaN} 

Ahora queremos averiguar en la que los índices esta contiene NaN, de modo que pueda sustituirlos por '' (cadena vacía) .

Si uso cellfun con isnan puedo obtener una salida inútil

cellfun(@isnan, a, 'UniformOutput', false) 

ans = 
[   0] 
[1x3 logical] 
[   1] 

Entonces, ¿cómo puedo hacer esto correcto?

Respuesta

11

En efecto, como lo encontró a sí mismo, esto se puede hacer por

a(cellfun(@(x) any(isnan(x)),a)) = {''} 

Desglose:

Fx = @(x) any(isnan(x)) 

devolverá un escalar lógico, independientemente de si x es un escalar o vector. Utilizando esta función dentro de cellfun luego erradicar la necesidad de 'UniformOutput', false:

>> inds = cellfun(Fx,a) 
inds = 
    0 
    0 
    1 

Estos pueden ser utilizados como índices de la matriz original:

>> a(inds) 
ans = 
    [NaN] 

que a su vez permite la asignación de estos índices:

>> a(inds) = {''} 
a = 
    [1] 
    'abc' 
    '' 

Tenga en cuenta que la asignación debe realizarse en una matriz de celdas. Si no entiende esto, lea las diferencias entre a(inds) y a{inds}.

+0

Si 'x' es una matriz, es necesario alterar la función anónima a' @ (x) any (any (isnan (x))) '(es decir, agregue' any' por segunda vez, para asegurarse de obtener un escalar de la función)). –

+1

@ peci1: tienes razón. En realidad, de manera más general, sería mejor hacer 'any (isnan (x (:))', que funciona para matrices de cualquier dimensión y llama a 'any' solo una vez. –

2
  • a(ind) = [] quitará las entradas de la matriz
  • a(ind)= {''} sustituirá al NaN con una cadena vacía.

Si desea eliminar la entrada utilice = [] en lugar de = {''}.
Si desea sustituir los NaN s con un valor diferente que acaba de establecer igual al valor que se utilizan llaves:

a(ind) = {value} 
Cuestiones relacionadas