Reemplazar las células vacías con las lógicas de 0 antes de cell2mat en MATLAB
-
26-09-2019 - |
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.
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));