size_t DTree::SplitData(arma::mat& data, const size_t splitDim, const double splitValue, arma::Col<size_t>& oldFromNew) const { // Swap all columns such that any columns with value in dimension splitDim // less than or equal to splitValue are on the left side, and all others are // on the right side. A similar sort to this is also performed in // BinarySpaceTree construction (its comments are more detailed). size_t left = start; size_t right = end - 1; for (;;) { while (data(splitDim, left) <= splitValue) ++left; while (data(splitDim, right) > splitValue) --right; if (left > right) break; data.swap_cols(left, right); // Store the mapping from old to new. const size_t tmp = oldFromNew[left]; oldFromNew[left] = oldFromNew[right]; oldFromNew[right] = tmp; } // This now refers to the first index of the "right" side. return left; }