【问题标题】:Count the number of non-scalar items in a cell array计算元胞数组中非标量项的数量
【发布时间】:2018-07-21 18:17:19
【问题描述】:

我有一个单元格c 有一些(相当大的)1:10 的特定排列,其中一些是重复的。如何计算每个排列的出现次数?

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

c([1 2 5 4 3 7 8 9 6 10]) = 20

经过一番搜索,有histcounts 但它似乎只适用于双打数组。我也不想使用for,因为有很多不同的排列。

【问题讨论】:

  • for 循环本身并不慢,MATLAB 将它们优化得非常快。如果您可以使用 for 循环结构来说明您的预期行为,那将很有用,然后向量化它可能是我们可以快速提供帮助的事情(如果需要,除非它足够快!)。

标签: matlab permutation cell-array


【解决方案1】:

让我们定义示例数据cN 排列的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的唯一排列,以及一个列向量count_perms和相应的出现次数。

【讨论】:

    【解决方案2】:

    这是一种定义匿名函数来计算单元格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
    

    这给出了您所写的内容,但最好为匿名函数使用不同的名称以避免混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      相关资源
      最近更新 更多