2012-03-14 4 views
7

Я хочу удалить все пустые ячейки в нижней части массива матрицы Matlab. Однако весь пример кода, который я нашел, сводит матрицу к вектору, чего я не хочу.удалить пустые ячейки в MATLAB

Так что этот код

a = { 1, 2; 3, 4; [], []} 
emptyCells = cellfun('isempty', a); 
a(emptyCells) = [] 

результаты в этом векторе

а = [1] [3] [2] [4]

Но я хочу вместо этого массива

a =

[1] [2] 

[3] [4] 

Как бы я это сделал?

ответ

15

Если вы хотите удалить все строки в массиве ячейки, где все ячейки пусты, вы можете использовать follwing:

a = { 1, 2; 3, 4; [], []} 
emptyCells = cellfun('isempty', a); 

a(all(emptyCells,2),:) = [] 

a = 
    [1] [2] 
    [3] [4] 

Причина это не работает в вашей формулировке является то, что если вы индекс с массивом, результат преобразуется в вектор (поскольку нет гарантии, что все строки или столбцы будут удалены, а не отдельные элементы).

1

Это работает для меня:

a = { 1, 2; 3, 4; [], []}; 
emptyCells = cellfun('isempty', a); 
cols = size(a,2); 
a(emptyCells) = []; 
a = reshape(a, [], cols); 

, но я не уверен, если это будет достаточно универсально для вас - будет у вас всегда есть полные ряды пустых ячеек в нижней части массива?

+0

В настоящее время да, но в целом я не могу быть уверен. Я также думал об использовании reshape, но в конце я использовал простой поиск для последней строки с не пустым, потому что я нахожу код, который вы разместили слишком сложно или acutal задачи. –

0

Более простое решение очень специфичны для вашей проблемы, чтобы преобразовать клетки непосредственно в матрицу:

cleanedA = cell2mat(a); 

Он преобразует в нормальную матрицу, и при этом это удаляет пустые ячейки.

Тогда, конечно, вы можете переконвертировать его в массив ячеек с помощью следующей команды:

a = mat2cell(cleanedA, [1 1], [1 1]) 

Сво не универсальна, но для примера отправил это самое простое решение, которое я могу придумать.

+0

На самом деле массив ячеек состоит в основном из строк, поэтому cell2mat не полезен для меня. –

1

Существует функция, которая обобщает удаление определенных строк/столбцов из ячейки, которая называется fun_removecellrowcols. Из-за удаления размеры ячеек изменяются.

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