Список матриц как объект arma в функции r cpp - PullRequest
1 голос
/ 09 января 2020

Я очень новичок в R cpp и у меня есть вопрос, касающийся определения списка матриц как объекта arma. Я хотел бы ускорить расчет функции правдоподобия для скрытой марковской модели с ковариатами в ненаблюдаемом процессе. Следующая функция в C ++ -коде вычисляет вероятность для скрытой марковской модели без ковариат в процессе: матричная гамма не изменяется по наблюдениям. Это работает.

// [[Rcpp::export]]
double nLogLike_Rcpp(arma::mat ap, arma::mat gamma, arma::rowvec foo, int n)
{
        double lscale=0.0;
    int i=1;
    double sumfoo;

    for(i=1;i<n;i++)
    {       
        foo=foo*gamma%ap.row(i);
        sumfoo=sum(foo);
        lscale=lscale+log(sumfoo);
        foo=foo/sumfoo;
    }

    return lscale;
}


Здесь я попытался написать функцию так, чтобы гамма была списком из n матриц, где n - это число наблюдений, так что переход Матрица вероятности различна для каждого наблюдения. Но я получаю сообщение об ошибке, если код работает.

// [[Rcpp::export]]
double nLogLike_Rcpp(arma::mat ap, Rcpp:: List gamma, arma::rowvec foo, int n)
{
        double lscale=0.0;
    int i=1;
    double sumfoo;

    for(i=1;i<n;i++)
    {


        gamma= Rcpp::as<arma::mat>(gamma[i])
        foo=foo*gamma%ap.row(i);
        sumfoo=sum(foo);
        lscale=lscale+log(sumfoo);
        foo=foo/sumfoo;
    }

    return lscale;
}

Я был бы очень рад, если бы кто-нибудь мог помочь мне понять, как правильно определять списки матриц.)))

UPD: это сообщение об ошибке:

Ошибка в источнике Cpp ("nLogLike_gamma. cpp"): Произошла ошибка 1 при создании общей библиотеки.

часть R- код, в котором встроена функция C ++:



    #N=3: number of states
    Z<-length(hmmseries)
...
allprobs <- matrix(1,nrow=Z,ncol=N) ### Matrix with Z rows and N columns 

  ind <- which(!is.na(hmmseries)) 
  for (j in 1:N){
    allprobs[ind,j] <- dnorm(hmmseries[ind],mean=mu[j],sd=sigma[j])
  }




  foo <- delta%*%diag(allprobs[1,])### First alpha variable
  ll <- log(sum(foo))
  foo <- foo/sum(foo)



  ll <- nLogLike_Rcpp(allprobs, g, foo, Z) ### the rest variables calculated via Rcpp 

  #for(t in 2:Z){
  #  foo <- phi%*%g[[t]]%*%diag(allprobs[t,])  ####foo <- phi%*%g[[xneu$Hour[t-1]]]%*%diag(allprobs[t,])
   # ll <- ll+log(sum(foo))
   # phi <- foo/sum(foo)
   # lalpha[,t]<-ll+log(phi)
  #}

...