2012-03-20 64 views
2

所以子集内计数的值出现,设定一个矩阵,像这样:使用SUM和独特的矩阵

20 2 
20 2 
30 2 
30 1 
40 1 
40 1 

我想算1时的第1列的每个唯一值的次数。我可以通过[sum(x(1:2,2)== 1)]为每个值做很长的路,但我认为这将是UNIQUE函数的完美用法。我怎么能解决这个问题,使我能得到的输出是这样的:如果

20 0 
30 1 
40 2 

对不起的解决方案似乎很明显,我的回路的把握是非常差的。

回答

2

事实上唯一的一个很好的选择:

u=unique(x(:,1)) 
res=arrayfun(@(y)length(x(x(:,1)==y & x(:,2)==1)),u) 

拆开最后一行:

  1. arrayfun(乐趣,数组)将乐趣应用到数组中的每个元素,并将其放入一个新数组中,并返回该数组。
  2. 此函数是函数@(y)length(x(x(:,1)==y & x(:,2)==1)),它可以找到条件为x(:,1)==y & x(:,2)==1)的x部分的长度(称为逻辑索引)。因此,对于每个独特元素,它会找到X中的行,其中第一个是唯一元素,第二个是1。
+0

这很好用,谢谢。阅读“帮助”条目并不能帮助我理解这个论证的工作原理。你会好好解释一下吗? – luser 2012-03-20 16:29:39

1

试试这个(在this answer指定):

>>> [c,~,d] = unique(a(a(:,2)==1)) 
c = 
    30 
    40 

d = 
    1 
    3 

>>> counts = accumarray(d(:),1,[],@sum) 
counts = 
    1 
    2 

>>> res = [c,counts] 
1

想想你有不同的整数的“数组”

tabulate功能将独特的值进行排序和计数occurances的数组。

table = tabulate(array) 

查找表格第2列中的唯一计数。