Question

J'ai un réseau de cellules vides et celles que je veux convertir en un ensemble logique, où les cellules vides sont des zéros. Quand j'utilise cell2mat, les cellules vides sont ignorées, et je me retrouve avec une matrice de 1 uniquement de, sans référence à l'indice précédent qu'ils détenaient. Est-il possible d'effectuer cette opération sans utiliser des boucles?

Exemple de code:

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

Ce que j'ai essayé:

mylogicalarray=logical(cell2mat(mycellarray));

qui se traduit par [1,1,1,1], pas [1,0,1,1,1].

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

qui fonctionne, mais utilise des boucles.

Était-ce utile?

La solution

Si vous connaissez votre réseau de cellules est que va contenir les et [] (qui représentent vos zéros), vous pouvez simplement utiliser la fonction cellfun pour obtenir un index logique des cellules vides, nier alors le vecteur d'index:

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

Si vos cellules pourraient contiennent encore des valeurs nulles (et pas seulement []), vous pouvez remplacer les cellules vides avec 0 en utilisant d'abord la fonction cellfun pour trouver un index pour les cellules vides:

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

Autres conseils

mycellarray( cellfun(@isempty, mycellarray) ) = {0};
mylogicalarray = logical(cell2mat(mycellarray));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top