2010-08-03 10 views
34

Jak wykrywać puste komórki w tablicy komórek? Wiem, że polecenie usunięcia pustej komórki to a(1) = [], ale nie mogę sprawić, że MATLAB automatycznie wykryje, które komórki są puste.Jak wykrywać puste komórki w tablicy komórek?

Tło: Wstępnie przydzieliłem macierz komórek przy użyciu a=cell(1,53). Następnie użyłem if exist(filename(i)) i textscan, aby sprawdzić plik i odczytać go. W rezultacie, gdy filename(i) nie istnieje, pusta komórka powoduje przejście do następnego pliku.

Po skończeniu czytania we wszystkich plikach, chciałbym usunąć puste komórki z a. Próbowałem if a(i)==[]

Odpowiedz

53

Używaj CELLFUN

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

Uwaga: a(i)==[] nie będzie działać. Jeśli chcesz wiedzieć, czy i-ta komórka jest pusta, musisz użyć nawiasów klamrowych, aby uzyskać dostęp do zawartości komórki. Ponadto, ==[] jest wartością pustą, zamiast true/false, więc zamiast tego należy użyć polecenia isempty. W skrócie: a(i)==[] powinno zostać przepisane jako isempty(a{i}).

+15

na lekką poprawę wykorzystania prędkości 'emptyCells = cellfun ('isEmpty', a);' ... 'cellfun' posiada wewnętrzny przełącznik' 'instrukcja, która sprawdza, czy ciąg jest jedną z kilku funkcji, które może zrobić" magiczny "wzrost prędkości z ... Jest to opisane tutaj: http://undocumentedmatlab.com/blog/cellfun-undocumented-performance -boost/ – JudoWill

+0

+1 dla określenia sposobu usuwania pustych komórek! Pozostaje ci tablica komórek zawierająca tylko niepuste wpisy! – Matteo

0

Wszystkie powyższe odpowiedzi są niepoprawne, ponieważ w moim przypadku, gdy je użyłem, usunęły puste komórki, a następnie wszystkie elementy tablicy komórek umieszczone w rzędzie zamiast zachowywać ich rzeczywisty kształt. W rzeczywistości, po zastosowaniu tego rodzaju podejścia, elementy macierzy komórek stają się wektorami komórek rzędu.

Znalazłem to podejście, które działa poprawnie w moim przypadku.

źródło: https://groups.google.com/forum/#!topic/comp.softsys.matlab/p3NX0fI6u90

podejście:

myCellARRAY(all(cellfun(@isempty,myCellARRAY),2), :) = []; 
Powiązane problemy