我对 Rcpp 很陌生,并且有一个关于将矩阵列表定义为 arma 对象的问题。我想加快在不可观察过程中具有协变量的隐马尔可夫模型的似然函数的计算。C++ 代码中的以下函数计算过程中没有协变量的隐马尔可夫模型的似然性:矩阵 gamma 不会随着观测值而改变。有用。
// [[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;
}
在这里,我尝试编写函数,使 gamma 是 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:这是错误消息:
sourceCpp("nLogLike_gamma.cpp") 中的错误:构建共享库时发生错误 1。
内置 C++ 函数的 R 代码:
#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)
#}