在matlab中的矩阵中的分组元素

时间:2014-08-18 11:54:05

标签: matlab matrix grouping

我有一个矩阵A = [1 2 4 4 8 8 8 4 1 7 7 8 8 9],我想创建一个在A中具有相同元素数的新矩阵。

我有两个1,一个2,三个4,两个7,五个8和一个9。

我的新矩阵应为[数字;每个数字的数量]

newmatrix = [1 2 4 7 8 9; 2 1 3 2 5 1]

如何从A创建新矩阵?

2 个答案:

答案 0 :(得分:4)

  1. 标准推荐方法:使用uniquehistc

    uA = unique(A);
    result = [uA; histc(A, uA)];
    
  2. 另一种可能性是使用sparse进行计数,然后使用nonzeros提取值,find获取索引:

    s = sparse(1,A,1);
    result = [find(s); nonzeros(s).'];
    

    对于小A,第二种方法似乎更快,但首先是推荐的方法。

答案 1 :(得分:1)

您可以将uniquehistc组合在一起,这样做:

newmatrix = [unique(A); histc(A, unique(A))]

unique函数返回向量中所有数字的列表,而histc计算原始向量中每次出现的唯一值。

请注意,对于大型向量,Luis' answer会更快,因为它只调用unique一次。但是,如果你是那些喜欢单行的人之一,那么这个答案应该可以解决问题。

如果您的矢量可能是垂直的或水平的,那么上面的结果将导致2nx1向量而不是nx2矩阵。一种可能性是像这样调用reshape

result = reshape([uA; histc(A, uA)],[],2);