我有一个m-by-n矩阵。对于每一行,我想找到k个最大值的位置,并将其他值设置为0。
Example, for k=2
I WANT
[1 2 3 5 [0 0 3 5
4 5 9 3 0 5 9 0
2 6 7 1] 0 6 7 0 ]
答案 0 :(得分:2)
您可以使用sort
的第二个输出轻松实现:
data = [ 1 2 3 5
4 5 9 3
2 6 7 1 ];
k = 2;
[M N] = size(data);
[~, ind] = sort(data,2);
data(repmat((1:M).',1,N-k) + (ind(:,1:N-k)-1)*M) = 0;
在示例中,这给出了
>> data
data =
0 0 3 5
0 5 9 0
0 6 7 0
答案 1 :(得分:0)
您可以使用prctile
命令查找每行阈值
prctile
返回data
行中值的百分位数,因此可以轻松调整以返回阈值,高于该阈值,每行k
个最大元素存在:
T = prctile( data, 100*(1 - k/size(data,2)), 2 ); % find the threshold
out = bsxfun(@gt, data, T) .* data; % set lower than T to zero
对于我们提出的问题中发布的data
矩阵
>> out
out =
0 0 3 5
0 5 9 0
0 6 7 0