确定向量中簇的最大值的索引

时间:2014-04-13 11:39:03

标签: matlab

我有一个矢量让我们说A大小为100x2A的第一列的值的范围是1到8.而第二列的值只是随机数。因此,第一列就像一个簇号的标识。我想要做的是,我想得到第二列中最多8个值的行的索引,但是每个群集中谁是最大的。因此结果将是每个集群中最大的8个索引,这意味着那些最大的8个可能不是整个向量中最大的,因为可能是集群1从顶部有三个,但因为我只从每个集群中取一个只有其中最大的一部分才能被拍摄。

请告知如何在matlab中完成此操作,如果需要更多详细信息,请告知我们

3 个答案:

答案 0 :(得分:3)

accumarray与自定义功能结合使用:

%// example data, second columns are random numbers between 0 and 1 
A = [ randi(8,100,1), rand(100,1) ]

maxima = accumarray( A(:,1), A(:,2), [], @max)

它将返回每个群集的所有最大值,但不返回其索引。


要获得最大值的索引,您需要max函数的第二个输出,我不知道是否可以在与accumarray一起使用时获取。但是有以下解决方法:

idx = accumarray( A(:,1), A(:,2), [], @(x) find(A(:,2) == max(x)))

最后输出看起来像:

output = [A(idx,1) idx A(idx,2)]

output =

    1.0000   29.0000    0.9319
    2.0000   18.0000    0.7177
    3.0000   81.0000    0.9554
    4.0000   72.0000    0.9127
    5.0000   55.0000    0.9984
    6.0000   27.0000    0.7809
    7.0000    4.0000    0.8598
    8.0000   14.0000    0.9946

第一列是簇号,第二列是每个最大值的索引,第三列是其值。

答案 1 :(得分:2)

要获得最大值及其位置,可以使用sortrows更简单的替代方法:

As = sortrows([A (1:size(A,1)).']); %'// 3rd column keeps track of original order
ind = find(diff([As(:,1); inf])); %// find last occurrence of each column-1 value
maxValues = As(ind,2); %// maxima
maxIndices = As(ind,3); %// locations of maxima

答案 2 :(得分:2)

sparse数组有助于进一步简化:

s = sparse(1:size(A,1),A(:,1),A(:,2));
[m,ii] = max(s)

示例:

>> A = [randi(8,100,1) rand(100,1)]
>> s = sparse(1:size(A,1),A(:,1),A(:,2));
>> [m,ii] = max(s);
>> [ii; full(m)].'

ans =

   22.0000    0.9619
   68.0000    0.9561
   58.0000    0.9001
   14.0000    0.9133
   67.0000    0.9421
   53.0000    0.9027
   26.0000    0.8687
   18.0000    0.9961

每行的最大值的位置和值是上面结果中的列。

注意:您还可以通过以下方式构建s

s = spconvert([(1:size(A,1)).' A])