如何使用Matlab计算100000个向量中每个元素的出现次数?

时间:2014-07-06 19:00:41

标签: matlab

对于包含介于1和100之间的40个不同数字的100000个向量,如何计算100000个向量中每个元素的出现次数。

示例:

A = [2 5 6 9]; B = [3 6 9 1]

结果应该是数字介于1和10之间:[1 2 3 4 5 6 7 8 9 10,1 1 1 0 1 2 0 0 2 0]

3 个答案:

答案 0 :(得分:2)

您似乎想要计算所有值的直方图 使用hist命令

n = hist( A(:), 1:100 );

答案 1 :(得分:1)

假设您有一个存储所有这些向量的变量A(如Shai的假设),hist的另一个替代方法是使用accumarray。这应该会自动找出你所拥有的正确数量的垃圾箱,而不像hist那样指定它们。尝试:

n = accumarray(A(:), 1);

答案 2 :(得分:1)

您还可以使用sparse功能进行计数:

% 100000x1 vector of integers in the range [1,100]
A = randi([1 100], [100000 1]);

% 100x1 array of counts
n = full(sparse(A, 1, 1, 100, 1));

由于othersshown,因此结果应与:

相同
n = histc(A, 1:100);

或:

n = accumarray(A, 1, [100 1]);

(请注意,我在sparseaccumarray调用中明确指定了大小。这是因为如果某个特定向量A的值不是一直到100,那么计数数组n的长度将短于100。)


事实上,在accumarray doc页面的tips section中提到了所有这三种方法,这是三者中最灵活的。

  

accumarray的行为类似于histc函数的行为。   两种功能都将数据分组到箱中。

     
      
  • histc使用bin边缘将连续值分组为1-D范围。
  •   
  • accumarray使用n维下标对数据进行分组。
  •   
  • histc使用@sum返回bin计数。
  •   
  • accumarray可以将任何功能应用于垃圾箱。
  •   
     

您可以使用histc accumarray来模仿val = 1的行为。

     

sparse函数也具有类似于accumarray的累积行为。

     
      
  • sparse使用2-D下标将数据分组到分箱中,而accumarray使用n维下标将数据分组到分箱中。
  •   
  • sparse将具有相同下标的元素添加到输出中。 accumarray添加具有相同下标的元素   默认情况下输出,但可以选择将任何功能应用于容器。
  •