2012-08-10 11 views
7

pozwala zakładać Mam następującą tablicę:znalezienie wartości NaN jest tablica komórek

a = {1; 'abc'; NaN} 

teraz chcę, aby dowiedzieć się, w którym indeksy ten zawiera NaN, tak, że mogę zastąpić te z „” (pusty ciąg znaków) .

Jeśli używam cellfun z isnan dostaję bezużyteczną moc

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

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

Więc jak zrobiłbym to prawidłowe?

Odpowiedz

11

Rzeczywiście, jak znalazłeś się, można to zrobić przez

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

Podział:

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

zwróci zmienną logiczną , niezależnie od tego, czy x jest skalarem, czy wektorem. pomocą tej funkcji wewnątrz cellfun następnie erradicate potrzebę 'UniformOutput', false:

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

te mogą być stosowane jako wskaźniki dla oryginalnej tablicy:

>> a(inds) 
ans = 
    [NaN] 

co z kolei pozwala na przypisanie do tych wskaźników:

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

Należy pamiętać, że przypisanie musi dotyczyć samej komórki. Jeśli tego nie rozumiesz, zapoznaj się z różnicami między a(inds) i a{inds}.

+0

Jeśli 'x' jest macierzą, trzeba zmienić anonimową funkcję do' @ (x) any (any (isnan (x))) (tj. dodaj 'any' po raz drugi, aby upewnić się, że otrzymasz skalar z funkcji)). –

+1

@ peci1: masz rację. Właściwie, bardziej ogólnie, najlepiej byłoby zrobić 'any (isnan (x (:))', który działa dla tablic dowolnego wymiaru i wywołuje 'any' tylko raz. –

2
  • a(ind) = [] usunie wpisy z tablicy
  • a(ind)= {''} zastąpi NaN z pustym ciągiem.

Jeśli chcesz usunąć wpis, użyj = [] zamiast = {''}.
Jeśli chciał wymienić NaN S z inną wartością po prostu ustawić go równa tej wartości przy użyciu nawiasów klamrowych:

a(ind) = {value} 
Powiązane problemy