2012-08-10 12 views
7

lässt vermuten, ich habe folgendes Array:zu finden ist Zellenfeld

a = {1; 'abc'; NaN} 

Jetzt möchte ich in dem, um herauszufinden, Indizes diese NaN enthält, so dass ich diese mit ‚‘ (leere Zeichenkette) ersetzen kann .

Wenn ich cellfun mit isnan I

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

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

So eine nutzlose Ausgabe bekommen, wie kann ich das richtige tun?

Antwort

11

der Tat, wie Sie sich selbst gefunden, kann dies durch

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

erfolgen Aufschlüsselung:

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

gibt einen logischen Skalar zurück, unabhängig davon, ob x ein Skalar oder ein Vektor ist. Mit dieser Funktion innerhalb cellfun wird dann die Notwendigkeit erradicate für 'UniformOutput', false:

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

Diese als Indizes zur ursprünglichen Anordnung verwendet werden können:

>> a(inds) 
ans = 
    [NaN] 

wiederum die Zuordnung dieser Indizes ermöglicht:

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

Beachten Sie, dass die Zuweisung zu einem Zellenfeld selbst erfolgen muss. Wenn Sie das nicht verstehen, lesen Sie die Unterschiede zwischen a(inds) und a{inds}.

+0

Wenn 'X' ist eine Matrix, müssen Sie die anonyme Funktion '@ verändern (x) any (any (isnan (x))) '(dh add '' any' zum zweiten Mal, um sicherzustellen, dass Sie einen Skalar von der Funktion erhalten)). –

+1

@ peci1: Du hast Recht. Eigentlich wäre es am besten, 'any (isnan (x (:))' zu machen, das für Arrays jeder Dimension funktioniert und 'any' nur einmal aufruft. –

2
  • a(ind) = [] werden die Einträge aus dem Array entfernen
  • a(ind)= {''} die NaN mit einem leeren String ersetzen.

Wenn Sie den Eintrag löschen möchten, verwenden Sie = [] statt .
Wenn Sie die NaN s mit einem anderen Wert gerade eingestellt es gleich auf diesen Wert unter Verwendung von geschweiften Klammern ersetzen wollte:

a(ind) = {value} 
Verwandte Themen