2016-06-07 2 views
2

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

(извинения за, вероятно, не пишу это самый лучший путь) так клеток:

[1,2,3] []  [1,4,2] []  [] 
[]  [1,2,5] []  []  [2,2,1] 
[3,7,1] []  [1,1,1] [2,3,1] [1,2,2] 

нужно это:

[1,2,3] [1,2,5] [1,4,2] [2,3,1] [2,2,1] 
[3,7,1] []  [1,1,1] []  [1,2,2] 
[]  []  []  []  [] 

есть простой способ сделать это?

ответ

4

Вы можете использовать cellfun для прокрутки всех элементов и определения того, является ли ячейка пустой, затем вы можете отсортировать результат (логическую матрицу) по первому измерению. Это приведет к удалению всех пустых элементов (1) до последних строк и оставит непустые элементы (0) вверху и не изменит их порядок, так как они все равны (1).

data = {[1,2,3], [], [1,4,2], [], []; 
     [], [1,2,5], [], [], [2,2,1]; 
     [3,7,1], [], [1,1,1], [2,3,1], [1,2,2]}; 

% Create a logical matrix that is 1 where the empty elements are and sort the columns 
[~, rows] = sort(cellfun(@isempty, data), 1); 

% Convert to linear index and index into the original matrix to re-arrange 
newdata = data(bsxfun(@plus, rows , size(data, 1)*(0:size(data, 2)-1))); 

% [1x3 double] [1x3 double] [1x3 double] [1x3 double] [1x3 double] 
% [1x3 double]    [] [1x3 double]    [] [1x3 double] 
%    []    []    []    []    [] 
+0

работал отлично, спасибо! – user3470496

+0

Или немного быстрее с помощью 'bsxfun':' bsxfun (@ plus, rows, nRows * (0: nCols-1)) '. – Divakar

+0

@ Divakar Отличная точка. Я знал, что где-то есть решение «bsxfun», просто не потратил на это времени. Я добавлю это к ответу. – Suever

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

  • Нет связанных вопросов^_^