// [[Rcpp::export]] NumericMatrix CPP_similarity_to_distance(NumericMatrix M, int opcode, double tol, bool duplicate = true) { if (!R_FINITE(opcode) || opcode < 0 || opcode > 0) stop("internal error -- invalid transformation method code"); unsigned int n_items = M.length(); NumericMatrix res = M; if (duplicate) res = clone(M); NumericMatrix::iterator _res = res.begin(); unsigned int n_clamped = 0; for (unsigned int i = 0; i < n_items; i++) { double x = _res[i]; switch (opcode) { case 0: if (x < -(1-tol)) { if (x < -(1+tol)) n_clamped++; x = -1; } else if (x > (1-tol)) { if (x > (1+tol)) n_clamped++; x = 1; } x = acos(x) * 180 / M_PI; break; } _res[i] = x; } if (n_clamped > 0) Rf_warning("angular distance may be inaccurate (some cosine values out of range)"); return res; }
// [[Rcpp::export]] NumericMatrix parallelMatrixSqrt(NumericMatrix x) { // allocate the output matrix NumericMatrix output(x.nrow(), x.ncol()); // SquareRoot instance that takes a pointer to the input & output data SquareRoot squareRoot(x.begin(), output.begin()); // call parallelFor to do the work parallelFor(0, x.length(), squareRoot); // return the output matrix return output; }
// [[Rcpp::export]] NumericMatrix samplehouseholds_format2(NumericMatrix phi, NumericMatrix w, NumericVector pi, NumericVector d, List lambda, int currrentbatch, int nHouseholds, int householdsize) { int K = w.nrow(); int L = w.ncol(); int p = d.length(); int n_lambdas = lambda.length(); int *lambda_columns = new int[n_lambdas]; double **lambdas = new double*[n_lambdas]; int maxDDtp = phi.nrow(); int maxdd = maxDDtp / p; //int ncol = householdsize * DIM + 1 + householdsize; //output data: zero-based //column 0: household unique index //column 1: member index within the household (pernum:person number?) //column 2 to 2+p-1: individual data //column 2+p: 2+p+n_lambdas-2: household level data //column 2+p+n_lambdas-1: household group indicator //column last hh_size: individual group indicator int DIM = 2 + p + n_lambdas - 1; //not output the household size int ncol = DIM * householdsize + householdsize + 1; NumericMatrix data(nHouseholds, ncol); //copy data from list of matrices to C++ for (int i = 0; i < n_lambdas; i++) { NumericMatrix l = lambda[i]; lambda_columns[i] = l.ncol(); lambdas[i] = new double[l.length()]; std::copy(l.begin(), l.end(), lambdas[i]); } //printf("in samplehouseholds\n"); NumericVector rand = runif(nHouseholds * ncol); //at most this many sampleHouseholds_imp_format2(data.begin(), rand.begin(), lambdas, lambda_columns, w.begin(), phi.begin(), pi.begin(),d.begin(), nHouseholds, householdsize, K, L,maxdd,p, currrentbatch,n_lambdas); //clean up delete [] lambda_columns; for (int i = 0; i < n_lambdas; i++) { delete [] lambdas[i]; } delete [] lambdas; //printf("done samplehouseholds\n"); return data; }