使用SUM和UNIQUE计算矩阵子集中值的出现次数

时间:2012-03-20 15:42:22

标签: matlab sum unique

所以,假定一个像这样的矩阵:

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

对不起,如果解决方案看起来很明显,我对循环的把握非常差。

3 个答案:

答案 0 :(得分:2)

确实,独特是一个不错的选择:

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

分开最后一行:

  1. arrayfun(fun,array)对数组中的每个元素应用fun,并将其放入一个新的数组中,然后返回。
  2. 此函数是函数@(y)length(x(x(:,1)==y & x(:,2)==1)),它查找条件x(:,1)==y & x(:,2)==1)所在的x部分的长度(称为逻辑索引)。因此,对于每个唯一元素,它会在X中找到第一行是唯一元素的行,第二行是一行。

答案 1 :(得分: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]

答案 2 :(得分:1)

考虑一下'array'中有各种整数的数组

tabulate函数将对唯一值进行排序并计算出现次数。

table = tabulate(array)

在表格第2栏中查找您的唯一计数。