在matlab中查找结构数组中的出现次数

在matlab中查找结构数组中的出现次数,matlab,Matlab,我有一个100K结构的数组。我在下面列出了这样一个结构的内容: 迭代:1 区块ID:86 BlockID的值可以介于1和100之间。我想知道BlockID的出现次数。例如:BlockID“1”出现25次;BlockID“98”出现58次,以此类推 我在网上查看并尝试了这些链接中提到的选项,但无法找到解决方案: 您可以使用arrayfun和count\u unique(count\u unique不是一个官方函数-它来自matlab中央文件交换,可以找到): NB:正如rody_o所指出的(尽管他

我有一个100K结构的数组。我在下面列出了这样一个结构的内容:

迭代:1

区块ID:86

BlockID的值可以介于1和100之间。我想知道BlockID的出现次数。例如:BlockID“1”出现25次;BlockID“98”出现58次,以此类推

我在网上查看并尝试了这些链接中提到的选项,但无法找到解决方案:

您可以使用
arrayfun
count\u unique
(count\u unique不是一个官方函数-它来自matlab中央文件交换,可以找到):

NB:正如rody_o所指出的(尽管他/她忽略了索引是不必要的这一事实),有一种连接ID的替代方法,即

ids = [struct1.BlockID];
或者,如果愿意,您可以创建自己的
count\u unique
函数

function [counts, uns] = count_unique(ids)
uns= unique(ids);
counts = arrayfun(@(x)sum(ids == x), uns);

为了简单起见,假设有一个大小为10的结构数组,其BlockID的值介于“1”和“3”之间:

%generate the struct array
for n = 1:10 
    structs(n).BlockID = num2str(randi(3));
end
%structs.BlockID : 3     2     1     3     3     2     1     1     2     2
要了解BlockID的出现次数,请执行以下操作:

count = accumarray(str2double({structs.BlockID})',1);
%count : 3     4     3
现在count(i)是值为“i”的BlockID的出现次数


对不起,我的英语很差。

您可以简单地使用Matlab自己的索引技术,结合
hist
unique

% sample data

a(1).BlockID   = 68
a(1).iteration = 1

a(2).BlockID   = 88
a(2).iteration = 12

a(3).BlockID   = 88
a(3).iteration = 14

a(4).BlockID   = 16
a(4).iteration = 18

% collect all BlockID values into array
b = [a.BlockID];

% count unique entries
[occurrences, entries] = hist(b, unique(b))
输出:

occurrences =
    1     1     2
entries =
    16    68    88

我总是感到惊讶的是,像
[struct(index).member]
符号这样广泛适用的东西被如此少的开发人员所知(或使用)

谢谢,这很有效。我使用的是arrayfun,但无法进一步获得唯一值。我只是在你提到的基础上增加了一个额外的步骤。使用cell2mat将“ID”转换为矩阵,然后其余的都是相同的。再次感谢。@Sarvayapi:你能再解释一下为什么需要cell2mat吗?
arrayfun
的输出是一个数组…我不知道为什么,但我在给出“unique(id)”时遇到了这个错误:使用cell/unique(第45行)输入的错误必须是字符串的单元格数组。这就是我尝试cell2mat的原因。@Sarvavyapi:奇怪-有一种独特的方法可以在单元阵列上工作,但也可以在普通阵列上工作。。。您能确认
ids
是一个数组吗?提示:连接时不需要索引-您提到的符号更简单:
[a.member]
,当然,它只是普遍适用的特定成员类型;)是的,我忘了我的习惯是用你需要索引的结构一致地写它…谢谢大家的回答。我将在这里尝试这些选项并给出结果。
occurrences =
    1     1     2
entries =
    16    68    88