Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert C array pointers to Rcpp with call by reference in R

Tags:

c++

c

r

rcpp

I have the following codes in C. I am new to Rcpp and I want to convert the C codes I have to Rcpp.

C code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


void calculate(const double *d, double *w, int col, int x) {
  int i,j; 
  for (i = 0; i < col; i++){
    for (j = 0; j < x; j++){
      w[j * col + i]++;
    } 
  } 
}

int main(){

    int i, col = 2, row = 6;
    int x = 5, y = 3, a = 0; 
    double d[] = {1.0, 0.8, 0.2, 1.0, 0.4, 0.6, 0.6, 0.4, 0.8, 1.0, 1.0, 0.2};
    double *w = (double*)calloc((row - a) * col * x, sizeof(double));


    for (i = 0; i < row - a; i++) {
        calculate(d + (i + a) * col, w + i * col * x, col, x);
    }

}

Rcpp code:

NumericVector calculate(NumericVector d, NumericVector w, int col, int x) {
  int i,j; 
  for (i = 0; i < col; i++){
    for (j = 0; j < x; j++){
      w[j * col + i]++;
    } 
  } 
  return w;
}

int i, col = 2, row = 6;
int x = 5, y = 3, a = 0; 
NumericVector w((row - a) * col * x);

for (i = 0; i < row - a; i++) {
    w = calculate(d + (i + a) * col, w + i * col * x, col, x);
}

This is my conversion that does not seem to work. My question is how to pass these parameters d + (i + a) * col and w + i * col * x as pointers in Rcpp, since its not an indexing?

like image 274
aliocee Avatar asked Jan 20 '26 04:01

aliocee


1 Answers

If the below line in your code works as intended,

NumericVector w((row - a) * col * x);

why not do the same in your for loop?

for (i = 0; i < row - a; i++) {
    NumericVector nvx(d + (i + a) * col);
    NumericVector nvy(w + i * col * x);
    w = calculate(nvx, nvy, col, x);
}
like image 66
P.W Avatar answered Jan 21 '26 17:01

P.W



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!