Advertisement
TLHLHT

RcppFunction

Oct 8th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. #include <Rcpp.h>
  2. // [[Rcpp::depends(RcppParallel)]]
  3. #include <RcppParallel.h>
  4.  
  5. struct EuclidianDistanceCalculator: RcppParallel::Worker{
  6.   const RcppParallel::RMatrix<double> inputMatrix;
  7.   RcppParallel::RVector<double> result;
  8.   const RcppParallel::RVector<int> oldColumns;  
  9.  
  10.   EuclidianDistanceCalculator(const Rcpp::NumericMatrix& inputMatrix,
  11.                               Rcpp::NumericVector& result, const Rcpp::LogicalVector& oldColumns)
  12.     : inputMatrix(inputMatrix), result(result), oldColumns(oldColumns){
  13.   }
  14.  
  15.   void operator()(std::size_t begin, std::size_t end){
  16.     for (std::size_t i = begin; i < end; i++){
  17.       RcppParallel::RMatrix<double>::Row row = inputMatrix.row(i);
  18.  
  19.       double partialEuclidianDistance = 0;
  20.       for (unsigned int j = 0; j < row.length(); j++){
  21.         if (oldColumns[j]){
  22.           partialEuclidianDistance += row[j] * row[j];
  23.         }
  24.       }
  25.       result[i] = partialEuclidianDistance;
  26.     }
  27.   }
  28. };
  29.  
  30. // [[Rcpp::export]]
  31. void calculateEuclidianDistances(const Rcpp::NumericMatrix& deltaMatrix, const Rcpp::LogicalVector& oldColumns, Rcpp::NumericVector& resultEuclidianDistances){
  32.   int length = deltaMatrix.nrow();
  33.   EuclidianDistanceCalculator edc(deltaMatrix, resultEuclidianDistances, oldColumns);
  34.   RcppParallel::parallelFor(0, length, edc);
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement