2013-09-11 4 views
7

У меня есть массив ячеек в MATLAB, давайте скажем cell_arr, и он имеет нулевые записи, а также записи ячейки non-zeros. Например:Как удалить нулевые записи внутри массива ячеек в MATLAB?

cell_arr = {0, 0, 0, 0, 0, {1x3 cell}, {1x3 cell}, {1x3 cell}, {1x3 cell}}; 

Может кто-нибудь, пожалуйста, как удалить эти нулевые записи из cell_arr или, чтобы найти индексы ненулевых элементов? Кроме того, я хочу избежать цикла for для выполнения этого задания.

Я уже пробовал find функция, однако find функция не применима для массивов ячеек. Мне интересно, существует ли одно выражение/выражение строки, выполняющее эту работу?

ответ

8

Насколько я знаю, нет единственной функции линии. Вы должны объединить некоторые функции. Первая строка находит нули в вашем массиве ячеек, а вторая строка удаляет эти записи. Обратите внимание на круглые скобки () i.s.o. {} для снятия.

Попробуйте это:

idxZeros = cellfun(@(c)(isequal(c,0)), cell_arr); 
cell_arr(idxZeros) = []; 
+4

Использование функции 'isequal (c, 0)' позволяет избежать использования двух тестов '~ iscell (c) && c == 0' – marsei

+0

@Magla true, однако я думаю, что это легче отлаживать, так как следует понимать, что всякий раз, когда первый тест не выполняется, второй тест не будет выполнен. – Nick

+1

@Nick: я не вижу ничего трудного для отладки о 'C_pruned = C (~ cellfun (@ (x) isequal (x, 0), C))' ... Still, +1 :) –

0
cell_arr(cellfun(@(x) ~x(1),cell_arr(:,1)),:) = [] 

Пожалуйста, дайте мне знать, если это работает.

+0

Это возвращает 'cell_arr = {} (0x9)' – Dan

+0

@Yunus. Спасибо за ответ. Нет, он не работает. Он дает пустой массив ячеек. Ответ, данный Ником (первый комментарий), работает. – Sanchit

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