2012-03-14 17 views
7

Chcę usunąć wszystkie puste komórki na dole macierzy komórek Matlaba. Jednak cały przykładowy kod, który znalazłem, zwinął matrycę do wektora, co nie jest tym, czego chcę.usunąć puste komórki w MATLAB

Więc ten kod

a = { 1, 2; 3, 4; [], []} 
emptyCells = cellfun('isempty', a); 
a(emptyCells) = [] 

skutkuje tym wektorze

a = [1] [3] [2] [4]

Ale chcę zamiast tego array

a =

[1] [2] 

[3] [4] 

Jak to zrobić?

Odpowiedz

15

Jeśli chcesz usunąć wszystkie wiersze w macierzy komórkowej, gdzie wszystkie komórka jest pusta, można skorzystać z następujących urządzeń:

a = { 1, 2; 3, 4; [], []} 
emptyCells = cellfun('isempty', a); 

a(all(emptyCells,2),:) = [] 

a = 
    [1] [2] 
    [3] [4] 

powód to nie działa w preparacie jest, że jeśli wskaźnik z tablicą, wyjście jest przekształcane do wektora (ponieważ nie ma gwarancji, że całe wiersze lub kolumny zostaną usunięte, a nie tylko pojedyncze elementy gdzieś).

1

Działa to dla mnie:

a = { 1, 2; 3, 4; [], []}; 
emptyCells = cellfun('isempty', a); 
cols = size(a,2); 
a(emptyCells) = []; 
a = reshape(a, [], cols); 

ale nie jestem pewien, czy to będzie na tyle ogólny dla ciebie - zawsze będziesz miał pełne rzędy pustych komórek w dolnej części tablicy?

+0

Obecnie tak, ale ogólnie nie mogę być tego pewien. Myślałem także o użyciu przekształcenia, ale w końcu użyłem prostego wyszukiwania ostatniego wiersza z nie jest pusty, ponieważ uważam, że kod, który wysłałeś, był zbyt skomplikowany lub akutalny. –

0

Prostszym rozwiązaniem bardzo specyficzne dla danego problemu jest przekształcenie komórek bezpośrednio do matrycy:

cleanedA = cell2mat(a); 

To konwertuje do normalnej matrycy, a gdy to robi to usuwa pustych komórek.

Potem, oczywiście, można przestawienia go do tablicy komórek za pomocą następującego polecenia:

a = mat2cell(cleanedA, [1 1], [1 1]) 

jej nie ogólne, ale na przykład pisał to najprostsze rozwiązanie mogę myśleć.

+0

W rzeczywistości moja macierz składa się głównie z łańcuchów, więc cell2mat nie jest dla mnie użyteczny. –

1

Istnieje funkcja, która generalizuje usunięcie określonego wiersza/kolumn z komórki, która nazywa się fun_removecellrowcols. Ze względu na usunięcie rozmiary komórek są zmieniane.

Powiązane problemy