[mlpack-git] master: Fix unnecessary copy. (644dfd9)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Wed May 20 23:06:00 EDT 2015


Repository : https://github.com/mlpack/mlpack

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/77d750c8fd46140b1d6060424f68768a21c89377...7e9cd46afb53817ae93ccbd02637d7726137ce4d

>---------------------------------------------------------------

commit 644dfd9808f06b23596d59cbcb45ed579c75a55a
Author: Ryan Curtin <ryan at ratml.org>
Date:   Tue May 19 15:31:09 2015 -0400

    Fix unnecessary copy.


>---------------------------------------------------------------

644dfd9808f06b23596d59cbcb45ed579c75a55a
 src/mlpack/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 697fb26..d29e290 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<MetricType, MatType, TreeType>::Iterate(
   if (iteration > 0)
   {
     Timer::Start("knn");
+
     // Find the nearest neighbors of each of the clusters.
     neighbor::NeighborSearch<neighbor::NearestNeighborSort, MetricType,
         TreeType> nns(centroidTree);
-    arma::mat interclusterDistancesTemp;
+
+    // If the tree maps points, we need an intermediate result matrix.
+    arma::mat* interclusterDistancesTemp =
+        (tree::TreeTraits<TreeType>::RearrangesDataset) ? new arma::mat :
+        &interclusterDistances;
+
     arma::Mat<size_t> 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<MetricType, MatType, TreeType>::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");



More information about the mlpack-git mailing list