我有一个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列中没有最大值。
答案 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,:);
如果第一列中的索引有间隙,这也适用。