2015-09-29 6 views
1

Можно ли переместить нулевые записи в конец в массиве двумерных ячеек? Например. если ячейка (2,2) была [], ячейка (3,2) заходила бы в (2,2) место, (4,2) в (3,2) и т. д., и нули были бы добавлены в конечная строка, например.перемещение пустых ячеек в массиве двумерных ячеек

here

+2

Ячейка по-прежнему должен быть «прямоугольной формы», так что вы можете легко удалить, и вся строка или столбец, но вы не можете удалить одну ячейку. Вы просто хотите переместить все пустые ячейки в конец их соответствующих строк? – Dan

+0

, но тогда ваша структура ячейки изменится, вам придется обнулить ее в конце, лучше переместить [] в последнюю строку/столбец вашей структуры ячейки, а не удалять их – GameOfThrows

+0

вы правы! Я отредактировал сообщение :) – Cobe

ответ

4
C = {1 []; [] 4; 'aa' []}; %// example cell array 
e = cellfun('isempty', C); %// this indicates for each cell if it's empty or not 
[~, r] = sort(e, 1); %// sorting of each col to move empty cells to the end 
[m, n] = size(C); 
C = C(bsxfun(@plus, r, (0:m:m*(n-1)))); %// apply sorting to each col, using linear indexing 

В этом примере C изначально

C = 
    [ 1]  [] 
     [] [4] 
    'aa'  [] 

и становится

C = 
    [ 1] [4] 
    'aa'  [] 
     []  [] 

Некоторые замечания:

  • Это работает, потому что sort is stable: он сохраняет первоначальный заказ в случае галстуков. Обратите внимание: e содержит только нули и единицы.
  • Linear indexing сделано эффективно с bsxfun. (repmat и sub2ind может быть использован вместо.) Массив
+0

отличный ответ! Очень эффективно, а также – GameOfThrows

+0

@GameOfThrows Спасибо! –

+0

: О, потрясающе! это было именно то, что я хотел! Большое спасибо! :) – Cobe

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