MATLAB: Keeping k largest values in each column of a sparse matrix

avoid loopsparse

Hi everyone,
I am trying to implement an algorithm that involves a pruning of a large sparse matrix. The pruning scheme should keep the k largest values (all nonzero values are positive) in each column of the sparse matrix M.
My current solution is:
function Mp = pruning(M,k)
[i,j,v] = find(M);
t = sortrows([i j v],[2 -3]);
dzero = cumsum([0;diff(t(:,2))]==0);
dz = [1;diff(t(:,2))]>0;
dd = dzero.*dz;
for r = 2:numel(dd);
dd(r) = max(dd([r-1 r]));
end;
I = (dzero-dd+1) <= k;
Mp = sparse(t(I,1),t(I,2),t(I,3),size(M,1),size(M,2));
Do you have better solutions (that avoid the loop)?
Thanks, W.

Best Answer

k = triu(bsxfun(@minus,dd,dd'));
pl = sum(k<0)+1==1:numel(dd);
m = dd(pl);
dd = m(cumsum(pl));