удалить пустые ячейки в MATLAB

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

Так этот код

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

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

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

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

a =

[1]    [2]

[3]    [4]

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

4 ответов


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

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

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

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

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


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

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

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


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


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

cleanedA = cell2mat(a);

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

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

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

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