2012-08-10 12 views
7

lascia supporre Ho il seguente array:trovare i valori Nan è array di celle

a = {1; 'abc'; NaN} 

Ora voglio sapere in cui gli indici questo contiene NaN, in modo che possa sostituire questi con '' (stringa vuota) .

Se uso cellfun con isnan ottengo un'uscita inutile

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

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

Così come avrei fatto questo corretto?

risposta

11

Infatti, come ti sei trovato, questo può essere fatto da

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

Composizione:

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

restituirà uno scalare logico, indipendentemente dal fatto che x sia uno scalare o un vettore. Utilizzando questa funzione all'interno cellfun poi erradicate la necessità di 'UniformOutput', false:

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

Questi possono essere usati come indici della matrice originale:

>> a(inds) 
ans = 
    [NaN] 

che a sua volta consente l'assegnazione di questi indici:

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

Si noti che l'assegnazione deve essere eseguita su un array di celle stesso. Se non lo capisci, leggi le differenze tra a(inds) e a{inds}.

+0

Se 'x' è una matrice, è necessario modificare la funzione anonima a' @ (x) any (any (isnan (x))) '(es. aggiungi' any' per la seconda volta, per assicurarti di ottenere uno scalare dalla funzione)). –

+1

@ peci1: hai ragione. In realtà, più in generale, sarebbe meglio fare 'any (isnan (x (:))', che funziona per matrici di qualsiasi dimensione e chiama 'any' solo una volta. –

2
  • a(ind) = [] rimuoverà le voci dalla matrice
  • a(ind)= {''} sostituirà la NaN con una stringa vuota.

Se si desidera eliminare la voce utilizzare = [] anziché = {''}.
Se si voleva sostituire le NaN s con un valore diverso basta impostarlo uguale a quel valore utilizzando le parentesi graffe:

a(ind) = {value} 
Problemi correlati