From ad4fbabeca2cbdf4cb47f1a923183027494ab0a8 Mon Sep 17 00:00:00 2001 From: Samuel Fadel Date: Thu, 22 Oct 2015 16:39:15 -0200 Subject: Added PLMP as an alternative technique to use; knn() is now exposed in the mp namespace. --- knn.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 knn.cpp (limited to 'knn.cpp') diff --git a/knn.cpp b/knn.cpp new file mode 100644 index 0000000..579a76f --- /dev/null +++ b/knn.cpp @@ -0,0 +1,30 @@ +#include "mp.h" + +void mp::knn(const arma::mat &dmat, arma::uword i, arma::uword k, arma::uvec &nn, arma::vec &dist) +{ + arma::uword n = dist.n_rows; + double dmax = arma::datum::inf; + nn.fill(i); + dist.fill(dmax); + if (k > n) { + return; + } + + const arma::vec &dvec = dmat.col(i); + for (arma::uword j = 0; j < n; j++) { + if (j == i || dvec[j] > dmax) { + continue; + } + + arma::uword l; + for (l = 0; dist[l] < dvec[j] && l < k; l++); + for (arma::uword m = k - 1; m > l; m--) { + nn[m] = nn[m - 1]; + dist[m] = dist[m - 1]; + } + + nn[l] = j; + dist[l] = dvec[j]; + dmax = dist[k - 1]; + } +} -- cgit v1.2.3