2010-08-03 13 views
34

Wie erkenne ich leere Zellen in einem Zellenfeld? Ich weiß, dass der Befehl zum Entfernen der leeren Zelle a(1) = [] ist, aber ich kann MATLAB anscheinend nicht erkennen, welche Zellen leer sind.Wie erkenne ich leere Zellen in einem Zellenfeld?

Hintergrund: Ich ein Zell-Array mit a=cell(1,53) voralloziert. Dann habe ich if exist(filename(i)) und textscan, um nach einer Datei zu suchen, und lesen Sie es ein. Als Ergebnis, wenn die filename(i) nicht existiert, eine leere Zelle resultiert und wir bewegen uns auf die nächste Datei. Wenn ich mit dem Lesen aller Dateien fertig bin, möchte ich die leeren Zellen von a löschen. Ich habe versucht, if a(i)==[]

Antwort

53

Verwenden CELLFUN

%# find empty cells 
emptyCells = cellfun(@isempty,a); 
%# remove empty cells 
a(emptyCells) = []; 

Hinweis: a(i)==[] wird nicht funktionieren. Wenn Sie wissen möchten, ob die i-te Zelle leer ist, müssen Sie geschweifte Klammern verwenden, um auf den Inhalt der Zelle zuzugreifen. Außerdem ==[] wertet aus, anstelle von true/false, so sollten Sie stattdessen den Befehl isempty verwenden. Kurz gesagt: a(i)==[] sollte als isempty(a{i}) umgeschrieben werden.

+15

für eine leichte Verbesserung der Geschwindigkeit Verwendung 'emptyCells = cellfun ('isempty', a);' ... 'cellfun' verfügt über einen internen Schalter' 'Anweisung, die überprüft, um zu sehen, ob die Zeichenfolge eine von einer Handvoll von Funktionen ist, die es kann eine" magische "Geschwindigkeit erhöhen mit ... Dies ist hier beschrieben: http://undocumentedmatlab.com/blog/cellfun-undocumedited-performance -boost/ – JudoWill

+0

+1 für die Angabe, wie man die leeren Zellen löscht! Dies hinterlässt ein Zell-Array, das nur die nicht leeren Einträge enthält! – Matteo

0

Alle oben genannten Antworten sind inkorrekt, weil in meinem Fall, wenn ich sie benutzte, entfernte sie leere Zellen und dann alle Elemente meines Zellenarrays in einer Reihe Weise statt ihre tatsächliche Form zu bewahren. In der Tat, nach der Verwendung dieser Art von Ansatz neigen Ihre Zellen-Array-Elemente dazu, ein Zeilenzellenvektor zu sein.

Ich habe diesen Ansatz gefunden, der in meinem Fall richtig funktioniert.

Quelle: https://groups.google.com/forum/#!topic/comp.softsys.matlab/p3NX0fI6u90

Ansatz:

myCellARRAY(all(cellfun(@isempty,myCellARRAY),2), :) = []; 
Verwandte Themen