2016-09-25 23 views
0

我有以下CPP功能,並希望把它寫R中轉換一段cpp的功能R來使用

我用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

你正在寫20世紀90年代風格的C代碼,有明確的指針運算,什麼不可以,並希望通過剛纔提RCPP事情會神奇的工作。

對不起,在這方面讓你失望。然而,RCPP將讓你

  • 使用尺寸由K矩陣申報N:Rcpp::NumericMatrix M(n, k);是單向的元素i和j是矩陣的
  • 訪問元素正如你應該M(i, j) = 42.0;
  • 回報它到R作爲保留尺寸的矩陣

我們現在在這裏有超過1000個關於Rcpp的問題,其中包括許多關於矩陣的問題。我們有Rcpp畫廊。我們有九個小插曲。我們有兩個專注於矩陣的軟件包。我們有我的書。我們有哈德利的寫作。幫你一個忙,去看看其中的一些。