удалить пустые ячейки в MATLAB - PullRequest
7 голосов
/ 14 марта 2012

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

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

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

приводит к этому вектору

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

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

a =

[1]    [2]

[3]    [4]

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

Ответы [ 4 ]

16 голосов
/ 14 марта 2012

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

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

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

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

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

1 голос
/ 25 апреля 2014

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

1 голос
/ 14 марта 2012

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

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

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

0 голосов
/ 14 марта 2012

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

cleanedA = cell2mat(a);

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

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

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

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

...