2010-04-12 10 views
17

Mam tablicę pustych komórek i tych, które chcę przekonwertować na tablicę logiczną, gdzie puste komórki są zerami. Kiedy używam cell2mat, puste komórki są ignorowane, a ja otrzymuję macierz składającą się wyłącznie z 1, bez odniesienia do poprzedniego indeksu, który trzymali. Czy istnieje sposób wykonania tej operacji bez użycia pętli?Zamień puste komórki na logiczne 0 przed cell2mat w MATLAB

Przykładowy kod:

for n=1:5    %generate sample cell array 
    mycellarray{n}=1; 
end 
mycellarray{2}=[]  %remove one value for testing 

Rzeczy próbowałem:

mylogicalarray=logical(cell2mat(mycellarray)); 

co skutkuje [1,1,1,1] nie [1,0,1,1, 1].

for n=1:length(mycellarray) 
    if isempty(mycellarray{n}) 
     mycellarray{n}=0; 
    end 
end 
mylogicalarray=logical(cell2mat(mycellarray)); 

który działa, ale używa pętli.

Odpowiedz

27

Jeśli znasz swoją tablicę komórka jest tylko będzie zawierać te i [] (które reprezentują swoje zer), można po prostu użyć funkcji CELLFUN uzyskać logiczny indeks pustych komórek, a następnie neguje wektor index:

mylogicalarray = ~cellfun(@isempty,mycellarray); 

Jeśli komórki mógłby nadal zawierają wartości zerowych (nie tylko []), można zastąpić puste komórki z 0 najpierw za pomocą funkcji CELLFUN znaleźć indeks dla pustych komórek:

emptyIndex = cellfun(@isempty,mycellarray);  %# Find indices of empty cells 
mycellarray(emptyIndex) = {0};     %# Fill empty cells with 0 
mylogicalarray = logical(cell2mat(mycellarray)); %# Convert the cell array 
+10

Wywołanie 'cellfun ('isempty', mycellarray)' jest znacznie szybsze niż uchwyt funkcji; 'isempty()' jest jedną z wielu funkcji korzystających z ogromnego zwiększenia prędkości, gdy jest jawnie nazwana w wywołaniu 'cellfun()'. –

+0

Jaki jest cel '~' przed 'cellfun'? – Chad

+0

Ah, '~' nie jest operatorem logicznym. – Chad

6
mycellarray(cellfun(@isempty, mycellarray)) = {0}; 
mylogicalarray = logical(cell2mat(mycellarray));