【问题标题】:Counting the number of occurrences of each element in Matlab计算Matlab中每个元素的出现次数
【发布时间】:2014-11-07 02:29:03
【问题描述】:

为了找出向量中每个元素的出现次数,可以在 MATLAB 中实现的最有效方法是什么?

例如:

A = { 'AA AB AC CD'; 'BA AC CF GD'; 'AA AB AC CD'; 'CF GD TH EF'; 'AA AB AC CD'}

我想得到“AA AB AC CD”重复3次,“BA AC CF GD”重复一次,“CF GD TH EF”重复一次。

我实际上并不关心函数的输出是 2 个向量,一个用于字符串,另一个用于计数,或者任何其他可以完成这项工作的输出。

我的方法是获取每个字符串并计算出现次数并从初始向量中删除所有出现次数,以便最坏情况下的运行时间大约为 n^2,其中 n 是A.

但我需要一种更有效的方法。以 C++ 为例,我可以使用地图来使运行时间几乎是线性的,但遗憾的是,地图并没有在 MATLAB 中实现。

【问题讨论】:

    标签: matlab maps


    【解决方案1】:

    我假设 A 是一个元胞数组 -

    A = { 'AA AB AC CD'; 'BA AC CF GD'; 'AA AB AC CD'; 'CF GD TH EF'; 'AA AB AC CD'}
    

    为了解决上述问题,这里可以建议一些方法。

    方法#1

    这是一种直截了当的方法-

    [unique_strings,~,labels] = unique(A,'stable');
    counts = histc(labels,1:max(labels))
    

    方法#2

    这是一个面向性能的解决方案,可将元胞数组转换为2D 数组 -

    [~,idx,labels] = unique(double(char(A)),'rows','stable')
    counts = histc(labels,1:max(labels))
    unique_strings = A(idx)
    

    方法#3

    这是另一种面向性能的解决方案,它在将单元格中的所有字符合并为一个数字后将单元格数组转换为 1D 数组 -

    num_array = char(A)-0
    pow10_vals = 10.^(size(num_array,2)-1:-1:0)
    [~,idx,labels] = unique(num_array*pow10_vals','stable') %//'
    counts = histc(labels,1:max(labels))
    unique_strings = A(idx)
    

    你会得到的输出 -

    >> unique_strings
    unique_strings = 
        'AA AB AC CD'
        'BA AC CF GD'
        'CF GD TH EF'
    >> counts
    counts =
         3
         1
         1
    

    输出也可以用table 以奇特的方式显示-

    >> table(unique_strings,counts)
    ans = 
        unique_strings    counts
        ______________    ______
        'AA AB AC CD'     3     
        'BA AC CF GD'     1     
        'CF GD TH EF'     1 
    

    请注意,如果您不关心字符串的顺序,您可以使用上述方法跳过'stable' 选项,这可能会更有效一些。

    【讨论】:

    • 如果你不关心字符串的顺序,你可以跳过'stable'选项,这样可能会更高效。
    • @husseinhammoud look at code,你的意思是我猜的一些解释。所以,这相当简单——unique 的第一步为我们获取了唯一的字符串,并根据每个单元格与其他单元格的共性为每个单元格分配一个标签。在下一步中,我们使用这些标签并获取与上一步中找到的每个唯一字符串/单元格相对应的每个标签的计数。这有点解释了吗?
    • @husseinhammoud 添加了另一个面向性能的解决方案供您测试!还要问你,你关心输出中字符串的顺序吗?
    • @husseinhammoud 太棒了!所以你现在有三种方法可以测试! :)
    • @husseinhammoud 哦,它基本上将单元格数组转换为带有char 的字符数组,然后我们将其转换为带有-0 的二维双精度数组,然后我们将所有数字合并到一行通过将每个数字分配为一个数字,将该双数组分配给一个数字。因此,我们得到了一个一维数组,然后通过unique 处理,其余方法与其他方法相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2018-10-24
    • 2017-08-28
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多