matlab结构单元数组中的搜索索引

matlab结构单元数组中的搜索索引,matlab,indexing,struct,cell,Matlab,Indexing,Struct,Cell,我需要在结构的单元数组中找到索引。例如,假设: arr{1}.id = 015 arr{2}.id = 015 arr{3}.id = 015 arr{4}.id = 015 arr{5}.id = 037 arr{6}.id = 037 arr{7}.id = 037 arr{8}.id = 037 arr{9}.id = 037 arr{10}.id = 037 arr{11}.id = 040 arr{12}.id = 040 ... 我需要找到只对应于id=037的索引(indx=[5

我需要在结构的单元数组中找到索引。例如,假设:

arr{1}.id = 015
arr{2}.id = 015
arr{3}.id = 015
arr{4}.id = 015
arr{5}.id = 037
arr{6}.id = 037
arr{7}.id = 037
arr{8}.id = 037
arr{9}.id = 037
arr{10}.id = 037
arr{11}.id = 040
arr{12}.id = 040
...
我需要找到只对应于id=037的索引(indx=[5 6 7 8 9])


是否有一个简单的matlabish解决方案,不使用循环和搜索每个元素?

矢量化是避免循环和编写快速代码的主要工具。当对同一类型的多个元素应用相同的操作时,可以使用它。在本例中,您需要相同的操作,但元素不同。使用循环(cellfun就是这样)是唯一的可能性

>> find(cellfun(@(x)(x.id),arr)==37)

ans =

     5     6     7     8     9    10
对于您描述的应用程序,我希望您会重复使用这一行,至少有干净的代码,我建议您使用函数

>> cellfield=@(data,field)(cellfun(@(x)(x.(field)),data))

cellfield = 

    @(data,field)(cellfun(@(x)(x.(field)),data))

>> cellfield(arr,'id')

ans =

  Columns 1 through 8

    15    15    15    15    37    37    37    37

  Columns 9 through 12

    37    37    40    40

您是否有使用结构单元数组的特定原因?从示例数据来看,结构数组是更好(更快)的数据结构。@Daniel我导入了一个大型JSON数据库(一个具有多个属性的人员列表,高度嵌套)。这是我在使用JSONlab时得到的输出(结构的单元数组)。我也不高兴。好吧,这可能意味着你有额外的字段,这些字段对所有元素都不一样?
[arr{:}]
成功了吗?你是对的:“使用horzcat时出错,连接的结构数组中的字段数不匹配。连接结构数组需要这些数组具有相同的字段集。”这是处理数据库的一种非常丑陋的方式,但我需要一些变通方法来完成我的工作。我可以实现一种搜索索引的简单方法,但我想学习新的技巧或其他处理结构单元数组的简洁方法。谢谢Daniel,这是一个了不起的解决方案!