我有一个矢量让我们说A
大小为100x2
。 A
的第一列的值的范围是1到8.而第二列的值只是随机数。因此,第一列就像一个簇号的标识。我想要做的是,我想得到第二列中最多8个值的行的索引,但是每个群集中谁是最大的。因此结果将是每个集群中最大的8个索引,这意味着那些最大的8个可能不是整个向量中最大的,因为可能是集群1从顶部有三个,但因为我只从每个集群中取一个只有其中最大的一部分才能被拍摄。
请告知如何在matlab中完成此操作,如果需要更多详细信息,请告知我们
答案 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])