Pregunta

Tengo una matriz de celdas vacías y las que quiero convertir en una matriz lógica, donde las celdas vacías son ceros. Cuando utilizo cell2mat, se ignoran las celdas vacías, y terminan con una matriz de únicamente 1 de, sin ninguna referencia al índice anterior que poseían. ¿Hay una manera de realizar esta operación sin necesidad de utilizar bucles?

Ejemplo código:

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

cosas que he intentado:

mylogicalarray=logical(cell2mat(mycellarray));

lo que resulta en [1,1,1,1], no [1,0,1,1,1].

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

que funciona, pero utiliza bucles.

¿Fue útil?

Solución

Si sabe que su matriz de células es solamente que va a contener unos y [] (que representan los ceros), sólo puede utilizar la función cellfun para obtener un índice lógico de las celdas vacías, entonces negar el vector índice:

mylogicalarray = ~cellfun(@isempty, mycellarray);
% Or the faster option (see comments)...
mylogicalarray = ~cellfun('isempty', mycellarray);

Si las células podría todavía contienen valores cero (no sólo []), podría reemplazar las celdas vacías con 0 usando primero la función cellfun para encontrar un índice para las celdas vacías:

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

Otros consejos

mycellarray( cellfun(@isempty, mycellarray) ) = {0};
mylogicalarray = logical(cell2mat(mycellarray));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top