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列中的唯一計數。