如何找到单元数组中最后一个非空元素的索引

4

我初始化了一个非常长的单元数组(向量?)

train_labels = cell(16218, 1);

这些内容将使用来自50个不同文件夹的文件进行填充,为确保文件在正确的位置被索引,我需要找到最后一个写入的cell数组的索引。

例如,在读取一个文件夹后,train_labels中的索引已达到5406。现在要从下一个文件夹中读取图像,它们必须保存到下一个索引位置,即5407。为使其正常工作,我需要找到train_labels中最后一个非空数组的位置。

由于简单的find(train_labels,1,'last')无法在cell数组上运行。我使用了cellfun但它也无法工作。这是我尝试过的:

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

希望能得到如何获取单元数组的最后一个索引的任何指导。

谢谢

1个回答

6
使用'isempty'选项的cellfun函数 -
last_non_empty_index = find(~cellfun('isempty',train_labels),1,'last')

你也可以使用cellfun(@isempty..),但我认为这可能会更慢。在这篇Undocumented MATLAB博客文章中详细讨论了这个问题。 isempty是一个内置的函数,因此似乎是一个经过优化的实现。其他2014A版本的cellfun可用的内置函数有:'isreal''islogical''length''ndims''prodofsize''size''isclass'。我希望这些也是快速的实现。有关这些的更多信息可以在官方文档中查看,可以通过>> help cellfun访问。

很好的提示。我已经忘记了所有特殊代码路径。我一直以为bsxfun也有特殊的代码路径来加速像plustimes这样的常见操作,但它只接受函数句柄。我敢打赌,它仍然对列在帮助中的函数有特殊处理,对于用户指定的句柄则进行通用处理。 - chappjc
@chappjc 是的,实际上如果你查看cellfun源代码,你会发现它们还有其他一些内置功能!尝试一下肯定很有趣! - Divakar
谢谢。解决了。只是好奇“find(〜cellfun...”和“find(@cellfun...”之间有什么区别? - StuckInPhDNoMore
1
@FarazKhan cellfun('isempty'..) 可以找到所有为空的元素,所以取反符号(~)可以找到所有非空的元素。..1,'last' 可以得到最后一个匹配项。希望这样说得清楚明白! - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接