удалить пустые ячейки в 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])
его не общий, но для примера опубликовано это самое простое решение, которое я могу придумать.