2010-04-12 10 views
17

Ich habe ein Array von leeren Zellen und Einsen, die ich in ein logisches Array konvertieren möchten, wobei die leeren Zellen Nullen sind. Wenn ich cell2mat benutze, werden die leeren Zellen ignoriert und ich bekomme eine Matrix von nur 1en, ohne Bezug auf den vorherigen Index, den sie hatten. Gibt es eine Möglichkeit, diese Operation ohne Schleifen durchzuführen?Ersetzen Sie leere Zellen durch logische 0 vor Cell2mat in MATLAB

Beispielcode:

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

Dinge, die ich versucht habe:

mylogicalarray=logical(cell2mat(mycellarray)); 

was dazu führt, [1,1,1,1], nicht [1,0,1,1, 1].

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

funktioniert, aber verwendet Schleifen.

Antwort

27

Wenn Sie Ihr Zellenfeld wissen, ist nur gehen diejenigen enthalten und [] (die Ihre Nullen darstellen), können Sie nur die Funktion verwenden CELLFUN einen logischen Index der leeren Zellen zu erhalten, zunichte machen dann den Indexvektor:

mylogicalarray = ~cellfun(@isempty,mycellarray); 

Wenn Ihre Zellen könnten enthalten immer noch Null-Werte (nicht nur []), könnten Sie die leeren Zellen mit 0 ersetzen, indem Sie zuerst die Funktion CELLFUN über einen Index für die leeren Zellen zu finden:

+10

Aufruf von 'cellfun ('isempty', mycellarray)' ist viel schneller als die Funktion handle; 'isempty()' ist eine von mehreren Funktionen, die enorme Geschwindigkeitszuwächse genießen, wenn sie explizit im cellfun() 'Aufruf genannt werden. –

+0

Was ist der Zweck der '~' vor 'cellfun'? – Chad

+0

Ah, '~' ist der logische Operator nicht. – Chad

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