Замените пустые ячейки логическими нулями перед cell2mat в MATLAB

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

Пример кода:

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));

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

вопрос задан 12.04.2010
Doresoom
5510 репутация

2 ответов


  • 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
    
    ответ дан gnovice, с репутацией 112908, 12.04.2010
  • 6 рейтинг
    mycellarray( cellfun(@isempty, mycellarray) ) = {0};
    mylogicalarray = logical(cell2mat(mycellarray));
    
    ответ дан Amro, с репутацией 114235, 12.04.2010