inline void flip(ref_col<T>& evs) { index_t l = 0; index_t r = evs.nelems() - 1; while (l < r) { swap(evs[l], evs[r]); ++l; --r; } }
void idx_group(const cref_matrix<int32_t>& L, ref_col<int32_t>& sx, ref_col<int32_t>& b, ref_col<int32_t>& e) { const int32_t K = (int32_t)b.nelems(); const int32_t n = (int32_t)L.nelems(); // first pass: count labels (use e as temporary store) for (int32_t i = 0; i < n; ++i) { int32_t k = L[i]; if (k >= 0 && k < K) ++ e[k]; } // set b and e int32_t pre_e = 0; for (int32_t k = 0; k < K; ++k) { b[k] = pre_e; pre_e += e[k]; e[k] = b[k]; } // second pass: fill in indices (and advance e) for (int32_t i = 0; i < n; ++i) { int32_t k = L[i]; if (k >= 0 && k < K) { sx[e[k]++] = (i + 1); } } }