2016-09-25 2 views
0

я следующие функции CPP и хотите записать его в RПреобразование функции CPP использовать в г

Я использую пакет rcpp скомпилировать и использовать это, но произошло

Действительно некоторые ошибки у меня есть проблемы в использовании указатель в R

 void creationPI(double *distC, int mC, int tailleC, double *PIC,int aC) 
    //distC: distribution de X ; mC= smax-smin+1 ie u+v+1; tailleC=a+1; PIC la matrice PI comme resultat 
    { 

    double *f;//=NULL; /*f(k)=P[X<=k]*/ 
    int t1,k,b,c,l; 
    int top_un,top_deux; 
     //FILE *matrix; 

    t1=2*(aC-1)+1; // taille du vecteur des f ca va de 1-a à a-1 ; k va de [0 à 2*(a-1)] 


    /* ALLOCATION DES MATRICES*/ 
     //if (!(f = (double *)calloc(t1, sizeof(double)))) 
     //exit(ALLOC_ERROR); 
    f = (double *)calloc(t1, sizeof(double)); 


    /* CREATION DES f */ 
     if ((aC-1)<=u) top_un=aC-1; else top_un=u; //top_un=min 
     if ((aC-1)>=u) top_deux=aC-1; else top_deux=u;//top_deux=max 
    /*On a 0<->1-a donc f[k]=P[X<=k+1-a] ou encore P[X<=l]=f[l-1+a]*/ 
     if (aC>v+1) 
       { //remplir le premier f 
      for (k=1-aC; k<smin; k++) {b=k-1+aC; *(f+b)=0;} // on passe dans cette boucle si a> v+1 
        //on remplit la suite jusqu'a min(u,a-1): P[X<=k+1-a]=P[X<=k-a]+P[X=k+1-a] 
        //on remplit donc soit jusqu'a la fin de f soit jusqu'au premier 1 car on utiliser tous les distC 
       for (k=smin; k<top_un+1 ; k++) {b=k-1+aC; *(f+b)=*(f+b-1)+*(distC +k-smin);} 
       //On gere le bout droit, quand il reste des f non remplis : 
       if (aC-1>u) {for (k=top_un+1; k<aC-1+1 ; k++) {b=k-1+aC; *(f+b)=1;}} 
       } 
     else // on a aC<=v+1 
       { // on remplit le premier f 
       *f=0; 
       for (k=smin; k<1-aC+1 ;k++) 
       {b=k-smin; *f=*f+ *(distC+b);} 
       // la suite : P[X<=k+1-a]=P[X<=k-a]+P[X=k+1-a], remarque identique a la precedente 
       for (k=1-aC+1;k<top_un+1; k++) 
       {b=k+aC-1; *(f+b)=*(f+b-1)+ *(distC+v+k);}//dernier +1 cf < 
       //On gere le bout droit, quand il reste des f non remplis : 
       if (aC-1>u) {for (k=top_un+1; k<aC-1+1 ; k++) {b=k-1+aC; *(f+b)=1;}} 
       } 

/*Creation de la matrice PI*/ 
/*PIC[a][a]=1*/ 
*(PIC + (tailleC * aC) + aC)=1; 
for (k=0; k<aC; k++) 
    { 
    b=aC-k-1; 
    *(PIC +(tailleC * k))=*(f+b); 
    c=(2*aC)-k-2;         /* Pi[0,k]=f(-k)*/ 
    *(PIC +(tailleC *k) +aC)=1- *(f+c);   /*Pi[a,l]=1-f(a-k-1)*/ 
    for (l=1; l<aC; l++) 
     { 
     b=l-k-smin; 
     if(b>=0 && b<mC) *(PIC+(tailleC *k)+l)=*(distC + b); 
         /*Pi[k,l]=P[X=l-k]*/ 
     else *(PIC+(tailleC *k)+l)=0.0; 
     } 
    *(PIC+(tailleC *aC)+k)=0.0; 
    } 

free(f); 

}//fin proc creationPI 

Могу ли я использовать Rcpp для запуска этой функции в R?

Как встретить указатель в R?

Благодаря

ответ

5

Вы пишете 1990-е годы в стиле кода C, с явной арифметики указателей, а что нет, и в надежде, что, просто упомянув Rcpp вещи волшебным образом работать.

Извините, что разочаровал вас на этом фронте. Тем не менее, Rcpp позволит вам

  • объявить п на к матрице с использованием размеров: Rcpp::NumericMatrix M(n, k); является одним из способов
  • доступ к элементам этой матрицы на элементы I и J так же, как вы должны M(i, j) = 42.0;
  • возвращения его к R в качестве матрицы с сохраненными размерами

Теперь у нас более 1000 вопросов на Rcpp, в том числе на матрицах. У нас есть Галерея Rcpp. У нас есть девять виньет. У нас есть два пакета, ориентированных на матрицы. У нас есть моя книга. У нас есть записи Хэдли. Сделайте себе одолжение и прочитайте некоторые из них.

Смежные вопросы