Как обнаружить пустые ячейки в массиве ячеек?

33

Как обнаружить пустые ячейки в массиве ячеек? Я знаю, что команда удалить пустую ячейку a(1) = [], но я не могу заставить MATLAB автоматически определять, какие ячейки пусты.

Фон: Я предварительно выделил массив ячеек с помощью a=cell(1,53). Затем я использовал if exist(filename(i)) и textscan, чтобы проверить файл и прочитать его. В результате, когда filename(i) не существует, получается пустая ячейка, и мы переходим к следующему файлу.

Когда я закончу чтение во всех файлах, я хотел бы удалить пустые ячейки a. Я попробовал if a(i)==[]

Теги:
is-empty
cell-array

2 ответа

53
Лучший ответ

Используйте CELLFUN

%# find empty cells
emptyCells = cellfun(@isempty,a);
%# remove empty cells
a(emptyCells) = [];

Примечание: a(i)==[] не будет работать. Если вы хотите узнать, пуста ли i-я ячейка, вам нужно использовать фигурные скобки для доступа к содержимому ячейки. Кроме того, ==[] оценивается как пустое, а не true/false, поэтому вместо этого вы должны использовать команду isempty. Короче: a(i)==[] следует переписать как isempty(a{i}).

  • 16
    для небольшого улучшения скорости используйте emptyCells = cellfun('isempty', a); ... cellfun имеет внутренний оператор switch который проверяет, является ли строка одной из немногих функций, с которыми она может сделать "магическое" увеличение скорости ... Это описано здесь: undocumentedmatlab.com/blog/…
  • 0
    +1 за указание, как удалять пустые ячейки! Это оставляет вас с массивом ячеек, содержащим только непустые записи!
0

Все вышеупомянутые ответы неверны, потому что в моем случае, когда я их использовал, они удаляли пустые ячейки, а затем все элементы массива ячеек располагались последовательно, а не сохраняли их фактическую форму. Фактически, после использования такого подхода элементы ячейки ячейки, как правило, являются вектором ячейки строки.

Я нашел этот подход, который работает правильно в моем случае.

источник: https://groups.google.com/forum/#!topic/comp.softsys.matlab/p3NX0fI6u90

подход:

myCellARRAY(all(cellfun(@isempty,myCellARRAY),2), : ) = [];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню