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

Matlab 通过仅保留第1列中第2列中具有最大值的条目,删除数组第1列中的重复项,matlab,matrix,unique,accumarray,Matlab,Matrix,Unique,Accumarray,我有一个nx2矩阵,它是由许多矩阵加在一起形成的。矩阵的第1列由表示项目ID的数字组成,第2列由相似性值组成。由于此矩阵是通过将多个矩阵串联在一起形成的,因此第1列中可能存在我不希望出现的重复值。我希望删除第1列中的所有重复值,以便对于第1列中存在重复值的任何值X,删除第1列=X的矩阵的所有行,但第1列=X的矩阵行和第2列值是矩阵中X的所有值中的最大值 Example: 1 0.85 1 0.5 1 0.95 2 0.5 result required

我有一个nx2矩阵,它是由许多矩阵加在一起形成的。矩阵的第1列由表示项目ID的数字组成,第2列由相似性值组成。由于此矩阵是通过将多个矩阵串联在一起形成的,因此第1列中可能存在我不希望出现的重复值。我希望删除第1列中的所有重复值,以便对于第1列中存在重复值的任何值X,删除第1列=X的矩阵的所有行,但第1列=X的矩阵行和第2列值是矩阵中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列中没有最大值的所有行来获得。

您可以尝试

result = accumarray( M(:,1), M(:,2), [max(M(:,1)) 1], @max);
据他说,这应该行得通

抱歉,我现在不能尝试

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

这基本上是将所需的项目ID按排序顺序重新附加到第二列中相应的最大相似性值。作为最终结果矩阵的结果,第1列中的每个值都是唯一的,第2列中的对应值是该项目的最大相似性值。
@Floris,谢谢你的帮助,如果没有你的帮助,你不可能解决这个问题。

如果你可能在索引中有漏洞,请使用:

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


还有一些其他的方法

第一种方法是,使用
sort
'down'
排序:

>> [~,IS] = sort(M(:,2),'descend');
>> [C,ia] = unique(M(IS,1));
>> M(IS(ia),:)
ans =
    1.0000    0.9500
    2.0000    0.5000
其次,使用(按第二列升序排序)和
unique
'first'
出现选项:

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

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

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

如果第一列中的索引有间隙,也可以这样做。

我认为解决方案与上面所述的不一样,但我将尝试研究accumarray函数。谢谢您的指导。@user1009091-如我所写,我的解决方案给出了“半个答案”。使用chappjc的答案中所示的
issparse
参数可以完成剩下的工作。我决定完成我开始的“更新”(我在另一个浏览器窗口中发现它完成了一半),只是为了稍微清理一下。使用稀疏矩阵方法后,无需排序或
唯一
。我认为这是目前最“类似于matlab”的解决方案。是的,在发布了我的原始答案后,我有机会尝试了一些东西,发现使用稀疏是一种可行的方法。但在我回来更新我的答案之前,你就发布了这篇文章……我不像喜欢原来的答案那样喜欢扩展的答案。@Floris说实话,我也不喜欢。我只是想提出一些其他的选择。把多余的东西放在不同的答案里会更聪明吗?有时候杂乱可能是消极的。@chappjc,Floris,稀疏似乎也是我的选择,它比我的答案要简洁得多。谢谢你们两位的回答。
>> [~,IS] = sort(M(:,2),'descend');
>> [C,ia] = unique(M(IS,1));
>> M(IS(ia),:)
ans =
    1.0000    0.9500
    2.0000    0.5000
>> [Ms,IS] = sortrows(M,2)
>> [~,ia] = unique(Ms(:,1),'last')
>> M(IS(ia),:)
ans =
    1.0000    0.9500
    2.0000    0.5000
M2 = sortrows(M);
result = M2(diff([M2(:,1); inf])>0,:);