3

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

迭代:1

区块ID:86

BlockID 的值可以在 1 到 100 之间。我想找出 BlockID 的出现次数。例如:BlockID "1" 出现了 25 次;BlockID "98" 出现了 58 次,以此类推。

我在网上查看并尝试了这些链接中提到的选项,但找不到解决方案: Matlab: Count number of structs that have a specific content 如何在matlab中计算单元格的唯一元素? Matlab:如何计算单元格中存储了多少个唯一字符串?

4

3 回答 3

1

为简单起见,假设有一个大小为 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 的出现次数。

对不起我的英语不好。

于 2012-08-03T03:15:33.967 回答
1

您可以简单地使用 Matlab 自己的索引技术,结合histand 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(indices).member],很少有开发人员知道(或使用)像符号这样广泛适用的东西......

于 2012-08-03T09:48:03.867 回答
1

您可以使用arrayfunand count_unique(count_unique 不是官方功能 - 它来自 matlab 中央文件交换,可以在此处找到):

ids= arrayfun(@(x)x.BlockID, struct1);
[vals, counts] = count_unique(ids);

注意:正如 rody_o 所指出的(尽管他/她错过了索引是不必要的事实),还有另一种连接 id 的方法,即

ids = [struct1.BlockID];

count_unique或者,如果您愿意,您可以创建自己的函数,

function [counts, uns] = count_unique(ids)
uns= unique(ids);
counts = arrayfun(@(x)sum(ids == x), uns);
于 2012-08-02T20:37:02.890 回答