计算Matlab中每个元素的出现次数

时间:2014-11-06 17:25:17

标签: matlab maps

为了找到向量中每个元素的出现次数,在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是元素的数量甲

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

1 个答案:

答案 0 :(得分:3)

我假设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'选项,这可能会更有效。