在matlab中查找结构数组中的出现次数
我有一个100K结构的数组。我在下面列出了这样一个结构的内容: 迭代:1 区块ID:86 BlockID的值可以介于1和100之间。我想知道BlockID的出现次数。例如:BlockID“1”出现25次;BlockID“98”出现58次,以此类推 我在网上查看并尝试了这些链接中提到的选项,但无法找到解决方案:在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所指出的(尽管他
您可以使用
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