From 644dfd9808f06b23596d59cbcb45ed579c75a55a Mon Sep 17 00:00:00 2001 From: Ryan Curtin Date: Tue, 19 May 2015 15:31:09 -0400 Subject: [PATCH] Fix unnecessary copy. --- .../methods/kmeans/dual_tree_kmeans_impl.hpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp b/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp index 697fb26fb6..d29e2900b4 100644 --- a/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp +++ b/src/mlpack/methods/kmeans/dual_tree_kmeans_impl.hpp @@ -105,12 +105,18 @@ double DualTreeKMeans::Iterate( if (iteration > 0) { Timer::Start("knn"); + // Find the nearest neighbors of each of the clusters. neighbor::NeighborSearch nns(centroidTree); - arma::mat interclusterDistancesTemp; + + // If the tree maps points, we need an intermediate result matrix. + arma::mat* interclusterDistancesTemp = + (tree::TreeTraits::RearrangesDataset) ? new arma::mat : + &interclusterDistances; + arma::Mat closestClusters; // We don't actually care about these. - nns.Search(1, closestClusters, interclusterDistancesTemp); + nns.Search(1, closestClusters, *interclusterDistancesTemp); distanceCalculations += nns.BaseCases() + nns.Scores(); // We need to do the unmapping ourselves, if the tree does mapping. @@ -118,12 +124,9 @@ double DualTreeKMeans::Iterate( { for (size_t i = 0; i < interclusterDistances.n_elem; ++i) interclusterDistances[oldFromNewCentroids[i]] = - interclusterDistancesTemp[i]; - } - else - { - // TODO: avoid copy. - interclusterDistances = interclusterDistancesTemp; + (*interclusterDistancesTemp)[i]; + + delete interclusterDistancesTemp; } Timer::Stop("knn");