Получение вывода 0 при использовании ccFFunction () Rcpp в R - PullRequest
0 голосов
/ 14 февраля 2019

Я использую Rcpp для ускорения двойного цикла for в R. Я реализовал код C ++ следующим образом;однако, независимо от вида ввода - например, любого вида векторов или чисел - я вставил в функцию, в итоге я всегда получаю 0 в качестве результата.

Где я ошибся в своем коде?

#include<Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double likelihood(NumericVector pA, NumericVector pB,
                  NumericVector pA_bin, NumericVector pB_bin,
                  double x_A, double x_B, double t_l)
{
  int nrow = pA.size();
  int ncol = pB.size();
  int nvec = nrow*(nrow-1)/2;
  int kk = 0;
  NumericVector p_l_nu_vec(nvec);
  //define 4 double variables to store coordinates of 4 vertices of each element
  double x1 = 0;
  double x2 = 0;
  double y1 = 0;
  double y2 = 0;
  //define 4 variables to store likelihood function values at 4 vertices
  double f1 = 0;   //point 1, bottom-left, (x1,y1)
  double f2 = 0;   //point 2, bottom-right, (x2,y1)
  double f3 = 0;   //point 3, top-right, (x2,y2)
  double f4 = 0;   //point 4, top-left, (x1,y2)


  for (int j=0;j<ncol;++j){
    for (int i=0;i<nrow;++i){
      if (i>j){
        // trapzoid rule, taking average of 4 vertices of the triangular 
        x1 = pA_bin[i];    //x value of left, point 1,4
        x2 = pA_bin[i+1];  //x value of right, point 2,3
        y1 = pB_bin[j];    //y value of bottom, point 1,2 
        y2 = pB_bin[j+1];  //y value of top, point 3,4
        f1 = pow(1-x1,t_l-x_A)*pow(x1-y1,x_A-x_B)*pow(y1,x_B);
        f2 = pow(1-x2,t_l-x_A)*pow(x2-y1,x_A-x_B)*pow(y1,x_B);
        f3 = pow(1-x2,t_l-x_A)*pow(x2-y2,x_A-x_B)*pow(y2,x_B);
        f4 = pow(1-x1,t_l-x_A)*pow(x1-y2,x_A-x_B)*pow(y2,x_B);
        //take the average of 4 vertices
        p_l_nu_vec[kk] = 1/4*(f1+f2+f3+f4);
        kk = kk+1;
      }
    }
  }

  //return p_l_nu_vec;
  return kk;
}

Пример вызова в R :

p_l_nu_vec_trapzoid = likelihood(pA,pB,pA_bin,pB_bin,x_A,x_B,t_l)

Ожидаемые результаты должны выводить некоторые действительные числавместо того, чтобы быть 0 все время.Например, в этом случае выходной kk записывает количество итераций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...