From eea2aa43b9b914b4d64f45bdf1f5358faefe2522 Mon Sep 17 00:00:00 2001 From: Ryan Curtin Date: Wed, 29 Jun 2016 11:07:06 -0400 Subject: [PATCH] Fix element access, and corner case where mod is 0. --- src/mlpack/methods/lsh/lsh_search_impl.hpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/mlpack/methods/lsh/lsh_search_impl.hpp b/src/mlpack/methods/lsh/lsh_search_impl.hpp index 64ad80ab34..e5004074b6 100644 --- a/src/mlpack/methods/lsh/lsh_search_impl.hpp +++ b/src/mlpack/methods/lsh/lsh_search_impl.hpp @@ -193,14 +193,19 @@ void LSHSearch::Train(const arma::mat& referenceSet, // Now we hash every key, point ID to its corresponding bucket. We must // also normalize the hashes to the range [0, secondHashSize). arma::rowvec unmodVector = secondHashWeights.t() * arma::floor(hashMat); - for (size_t j = 0; j < secondHashVectors.n_cols; ++j) + for (size_t j = 0; j < unmodVector.n_elem; ++j) { double shs = (double) secondHashSize; // Convenience cast. if (unmodVector[j] >= 0.0) - secondHashVectors[j] = size_t(fmod(unmodVector[j], shs)); + { + secondHashVectors(i, j) = size_t(fmod(unmodVector[j], shs)); + } else - secondHashVectors[j] = secondHashSize - - size_t(fmod(-unmodVector[j], shs)); + { + const double mod = fmod(-unmodVector[j], shs); + secondHashVectors(i, j) = (mod < 1.0) ? 0 : secondHashSize - + size_t(mod); + } } }