public SparseVector <double> Trim(SparseVector <double> vec, int size, double cutPerc) { SparseVector <double> trimmed = vec; if (vec.Count > size) { ArrayList <KeyDat <double, int> > tmp = new ArrayList <KeyDat <double, int> >(vec.Count); foreach (IdxDat <double> item in vec) { tmp.Add(new KeyDat <double, int>(item.Dat, item.Idx)); } tmp.Sort(DescSort <KeyDat <double, int> > .Instance); tmp.RemoveRange(size, tmp.Count - size); ArrayList <IdxDat <double> > tmp2 = new ArrayList <IdxDat <double> >(); foreach (KeyDat <double, int> item in tmp) { tmp2.Add(new IdxDat <double>(item.Dat, item.Key)); } tmp2.Sort(); trimmed = new SparseVector <double>(tmp2); } ModelUtils.CutLowWeights(ref trimmed, cutPerc); ModelUtils.TryNrmVecL2(trimmed); return(trimmed); }