2010-04-12 5 views
17

У меня есть массив пустых ячеек и те, которые я хочу преобразовать в логический массив, где пустые ячейки являются нулями. Когда я использую cell2mat, пустые ячейки игнорируются, и я заканчиваю матрицей только 1, без ссылки на предыдущий индекс, который они держали. Есть ли способ выполнить эту операцию без использования циклов?Замените пустые ячейки логическими 0 до cell2mat в MATLAB

Пример кода:

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

Вещи, которые я пробовал:

mylogicalarray=logical(cell2mat(mycellarray)); 

что приводит к [1,1,1,1], а не [1,0,1,1, 1].

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

который работает, но использует циклы.

ответ

27

Если вы знаете, что ваш массив ячеек является только будет содержать те и [] (которые представляют свои нули), вы можете просто использовать функцию CELLFUN, чтобы получить логический индекс пустых клеток, а затем свести на нет вектора индекса:

mylogicalarray = ~cellfun(@isempty,mycellarray); 

Если ваши клетки могут все еще содержат нулевые значения (не только []), вы могли бы заменить пустые ячейки с 0 по первому использованию функции CELLFUN найти индекс для пустых ячеек:

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

Вызов 'cellfun ('isempty', mycellarray)' намного быстрее, чем дескриптор функции; 'isempty()' является одной из нескольких функций, которые пользуются огромным увеличением скорости при явном имени в вызове 'cellfun()'. –

+0

Какова цель '' 'перед' cellfun'? – Chad

+0

А, '~' - логический оператор. – Chad

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

 Смежные вопросы

  • Нет связанных вопросов^_^