Как обнаружить пустые ячейки в массиве ячеек? Я знаю, что команда удалить пустую ячейку a(1) = []
, но я не могу заставить MATLAB автоматически определять, какие ячейки пусты.
Фон:
Я предварительно выделил массив ячеек с помощью a=cell(1,53)
.
Затем я использовал if exist(filename(i))
и textscan, чтобы проверить файл и прочитать его. В результате, когда filename(i)
не существует, получается пустая ячейка, и мы переходим к следующему файлу.
Когда я закончу чтение во всех файлах, я хотел бы удалить пустые ячейки a
. Я попробовал if a(i)==[]
Используйте CELLFUN
%# find empty cells
emptyCells = cellfun(@isempty,a);
%# remove empty cells
a(emptyCells) = [];
Примечание: a(i)==[]
не будет работать. Если вы хотите узнать, пуста ли i-я ячейка, вам нужно использовать фигурные скобки для доступа к содержимому ячейки. Кроме того, ==[]
оценивается как пустое, а не true
/false
, поэтому вместо этого вы должны использовать команду isempty
. Короче: a(i)==[]
следует переписать как isempty(a{i})
.
Все вышеупомянутые ответы неверны, потому что в моем случае, когда я их использовал, они удаляли пустые ячейки, а затем все элементы массива ячеек располагались последовательно, а не сохраняли их фактическую форму. Фактически, после использования такого подхода элементы ячейки ячейки, как правило, являются вектором ячейки строки.
Я нашел этот подход, который работает правильно в моем случае.
источник: https://groups.google.com/forum/#!topic/comp.softsys.matlab/p3NX0fI6u90
подход:
myCellARRAY(all(cellfun(@isempty,myCellARRAY),2), : ) = [];
emptyCells = cellfun('isempty', a);
...cellfun
имеет внутренний операторswitch
который проверяет, является ли строка одной из немногих функций, с которыми она может сделать "магическое" увеличение скорости ... Это описано здесь: undocumentedmatlab.com/blog/…