2014-10-23 4 views
4

Я инициализируется очень длинный массив ячеек (вектор?)Как найти индекс последнего непустого элемента в массиве ячеек

train_labels = cell(16218, 1); 

Они будут заполняться с использованием файлов из 50 различных папок, чтобы убедиться, что файлы индексируются в нужном месте, мне нужен индекс последнего массива ячеек, на который был записан.

Например, после чтения одной папки индекс в train_labels достиг 5406. Теперь, чтобы прочитать изображения из следующей папки, они должны быть сохранены в следующем индексе, который равен 5407. Чтобы выполнить эту работу, мне нужно найти местоположение последнего непустого массива в train_labels.

Поскольку простой find(train_labels,1,'last') не работает на массивах ячеек. Я использовал cellfun, но это тоже не работает. Это то, что я пробовал:

cellfun(@find, train_labels, 'last') 
Error using cellfun 
Input #3 expected to be a cell array, was char instead. 

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

Спасибо

ответ

6

Использование cellfun с 'isempty' вариант -

last_non_empty_index = find(~cellfun('isempty',train_labels),1,'last') 

Вы также можете использовать cellfun(@isempty..), но я считаю, что должен быть медленнее. Это подробно обсуждалось в этом документе Undocumented MATLAB Blog post.

isempty является встроенным и, как представляется, является оптимизированной реализацией. Другие встроенные модули, которые доступны в 2014A версии cellfun являются - 'isreal', 'islogical', 'length', 'ndims', 'prodofsize', 'size', 'isclass'. Я надеюсь, что это быстрые реализации. Более подробную информацию об этом можно найти в официальной документации, доступ к которой можно получить с помощью >> help cellfun.

+0

+1 специально для этой ссылки –

+0

Отличный совет. Я забыл все о специальных кодах. Я всегда предполагал, что 'bsxfun' также имеет специальные коды кода, чтобы сделать обычные операционные системы, такие как' plus' и 'times' быстрыми, но для этого нужны только функции. Я бы сказал, что у него все еще есть особые случаи для функций, которые перечисляли ему помощь и общую обработку для пользовательских дескрипторов. – chappjc

+0

@chappjc Да, на самом деле у них появилось несколько других встроенных модулей, если вы смотрите в исходный код 'cellfun'! Должно быть интересно попробовать! – Divakar

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