计算单元格数组中非标量项目的数量

时间:2018-07-21 18:17:20

标签: matlab permutation cell-array

我有一个单元格services.AddAuthentication() .AddFacebook(o => { o.AppId = Configuration.GetValue<string>("Facebook:AppId"); o.AppSecret = Configuration.GetValue<string>("Facebook:AppSecret"); o.Events.OnRemoteFailure = (context) => { context.Response.Redirect("/account/login"); context.HandleResponse(); return System.Threading.Tasks.Task.CompletedTask; }; }); ,其中有一些(很大)特定的1:10排列,其中有些是重复的。如何计算每个排列的出现次数?

输出应易于访问以供以后使用,例如我可以做类似

的操作
c

经过一些搜索后,有c([1 2 5 4 3 7 8 9 6 10]) = 20 ,但它似乎仅适用于双精度数组。我也不想使用histcounts,因为有很多不同的排列。

2 个答案:

答案 0 :(得分:1)

让我们用c的{​​{1}}排列定义示例数据N

1:M

然后

N = 1e5;
M = 10;
c = cell(1,N);
for n = 1:N
  c{n} = randperm(M);
end

给出一个[unique_perms,~,w] = unique(vertcat(c{:}), 'rows'); count_perms = accumarray(w,1); 列矩阵M,其中每一行是unique_perms的唯一排列,以及一个列向量c和相应的出现次数。

答案 1 :(得分:0)

这是定义匿名函数以计算单元格c中某些排列的一种方法:

permCount = @(perm, c) sum(cellfun(@(x) isequal(x, perm), c));

对于任务中的排列:

permCount([1 2 5 4 3 7 8 9 6 10], c)

将在c

中进行计数

如果愿意,可以在定义匿名函数之前确保单元格c存在。然后您可以将其保留为输入:

c = @(perm) sum(cellfun(@(x) isequal(x, perm), c)); % cell c must exist
c([1 2 5 4 3 7 8 9 6 10]) % gives the count

这完全可以提供您编写的内容,但最好为匿名函数使用其他名称,以避免混淆。