通过仅保留第1列中第2列中具有最大值的条目来删除数组的第1列中的重复项

时间:2014-02-26 03:25:08

标签: matlab matrix unique accumarray

我有一个n X 2矩阵,它是通过将许多矩阵附加在一起而形成的。矩阵的第1列由指示item_id的数字组成,第2列由相似性值组成。由于此矩阵是通过将多个矩阵连接在一起形成的,因此第1列中可能存在我不想要的重复值。我想删除第1列中的所有重复值,以便对于第1列中存在重复的任何值X,删除矩阵的所有行,其中列1 = X,除了矩阵的行所在列1 = X和column2值是矩阵中X的所有值中的最大值。

Example:

  1    0.85
  1    0.5
  1    0.95
  2    0.5

result required:
    1 0.95
    2 0.5 

通过删除n X 2矩阵中的所有行来获得,其中第1列中的重复值在第2列中没有最大值。

4 个答案:

答案 0 :(得分:2)

如果索引中可能存在空白,请使用sparse output

>> result = accumarray( M(:,1), M(:,2), [], @max, 0, true)
>> uMat = [find(result) nonzeros(result)]
uMat =
    1.0000    0.9500
    2.0000    0.5000

这也简化了输出第一列的创建。


使用unique以其他方式完成此操作。

首先,使用sort订购'descend'

>> [~,IS] = sort(M(:,2),'descend');
>> [C,ia] = unique(M(IS,1));
>> M(IS(ia),:)
ans =
    1.0000    0.9500
    2.0000    0.5000

其次,使用sortrows(按第二列升序排序),unique使用'first'出现选项:

>> [Ms,IS] = sortrows(M,2)
>> [~,ia] = unique(Ms(:,1),'last')
>> M(IS(ia),:)
ans =
    1.0000    0.9500
    2.0000    0.5000

答案 1 :(得分:1)

你可以尝试

result = accumarray( M(:,1), M(:,2), [max(M(:,1)) 1], @max);

根据the documentation,这应该有效。

道歉我现在无法尝试...

更新 - 我确实尝试了上述内容,它正确地给了我最大值。但是,它不会为您提供与最大值对应的索引。为此,您需要做更多的工作(因为标识符可能没有排序)。

result = accumarray( M(:,1), M(:,2), [], @max, true);  % to create a sparse matrix
c1 = find(result);     % to get the indices of nonzero values
c2 = full(result(c1)); % to get the values corresponding to the indices
answer = [c1 c2];      % to put them side by side

答案 2 :(得分:0)

result = accumarray( M(:,1), M(:,2), [max(M(:,1)) 1], @max);

finalResult = [sort(unique(M(:,1))),nonzeros(result)]

这基本上按排序顺序将所需的item_id重新附加到第二列中的相应max_similarity值。作为finalResult矩阵的结果,第1列中的每个值都是唯一的,第2列中的对应值是该item_id的最大相似度值。 @Floris,感谢你的帮助,没有你的帮助就无法解决这个问题。

答案 3 :(得分:0)

另一种方法:使用sortrows然后diff为第一列的每个值选择最后一行:

M2 = sortrows(M);
result = M2(diff([M2(:,1); inf])>0,:);

如果第一列中的索引有间隙,这也适用。