Rcpp::List RadiusSearch(Rcpp::NumericMatrix query_, Rcpp::NumericMatrix ref_, double radius, int max_neighbour, std::string build, int cores, int checks) { const std::size_t n_dim = query_.ncol(); const std::size_t n_query = query_.nrow(); const std::size_t n_ref = ref_.nrow(); // Column major to row major arma::mat query(n_dim, n_query); { arma::mat temp_q(query_.begin(), n_query, n_dim, false); query = arma::trans(temp_q); } flann::Matrix<double> q_flann(query.memptr(), n_query, n_dim); arma::mat ref(n_dim, n_ref); { arma::mat temp_r(ref_.begin(), n_ref, n_dim, false); ref = arma::trans(temp_r); } flann::Matrix<double> ref_flann(ref.memptr(), n_ref, n_dim); // Setting the flann index params flann::IndexParams params; if (build == "kdtree") { params = flann::KDTreeSingleIndexParams(1); } else if (build == "kmeans") { params = flann::KMeansIndexParams(2, 10, flann::FLANN_CENTERS_RANDOM, 0.2); } else if (build == "linear") { params = flann::LinearIndexParams(); } // Perform the radius search flann::Index<flann::L2<double> > index(ref_flann, params); index.buildIndex(); std::vector< std::vector<int> > indices_flann(n_query, std::vector<int>(max_neighbour)); std::vector< std::vector<double> > dists_flann(n_query, std::vector<double>(max_neighbour)); flann::SearchParams search_params; search_params.cores = cores; search_params.checks = checks; search_params.max_neighbors = max_neighbour; index.radiusSearch(q_flann, indices_flann, dists_flann, radius, search_params); return Rcpp::List::create(Rcpp::Named("indices") = indices_flann, Rcpp::Named("distances") = dists_flann); }
void qr<T>::output(array_2d<T>& q, array_2d<T>& r) const { array<T> tau(min_nm); if(r.rows() != m || r.columns() != n) r.resize(idx(m, n)); lapack_interface<T>::call_lapack_geqrf(r, tau, a); //Now construct Q //Q should be a MxM matrix if(q.rows() != m || q.columns() != m) q.resize(idx(m, m)); if(n <= m) { //Q can hold the MxN values of R needed by lapack's xORGQR routines for(size_t i = 0; i < m; i++) for(size_t j = 0; j < n; j++) q[m*j + i] = r(i,j); lapack_interface<T>::call_lapack_orgqr(q, tau); } else { //create a new array and do a copy since //Q cannot hold the MxN values of R as needed by lapack's xORGQR routines array_2d<T> temp_q(r(all(), size_range(0, m - 1))); lapack_interface<T>::call_lapack_orgqr(temp_q, tau); //copy the Q values from temp for(size_t i = 0; i < m; i++) for(size_t j = 0; j < m; j++) q[m*j + i] = temp_q[m*j + i]; } // R is upper triangular for(size_t i = 0; i < m; i++) for(size_t j = 0; j < n; j++) if(i > j) r(i,j) = 0; }