Я очень новичок в 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)
#}