使用sourceCpp和RcppArmadillo

时间:2015-05-18 06:57:57

标签: c++ r rcpp

我正在尝试使用Rcpp和RcppArmadillo(Windows中的Rstudio)创建一个包含一些函数的包。但是,我遇到了一些问题,我很感激你的意见。以下是.cpp文件(名为update_s.cpp):

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>

using namespace arma;
using namespace Rcpp;

// [[Rcpp::export]]

NumericVector update_sigma(NumericMatrix Theta, NumericMatrix Y, NumericMatrix M, NumericVector lambda, int nu){
  int n = Y.ncol();
  int K = Y.nrow();
  int R = Theta.ncol();
  double N = n;
  NumericVector Den(n);
  NumericMatrix Thetasq(n, R);
  NumericMatrix Residual(K, n);
  NumericMatrix Res_sq(K, n);
  NumericMatrix Tmp(n, K);
  NumericVector scale;
  NumericVector sigma(K);

  for (int j = 0; j < R; j++){
    arma::Thetasq.col(j) = pow( arma::Theta.col(j), 2);
  }
  for (int i = 0; i < n; i++){
    Den(i) = sum(Thetasq.row(i));
  }
  Residual = Y - M* arma::trans(Theta);
   for(int i = 0; i < K; i++){
   Res_sq.row(i) = pow(Residual.row(i),2); 
  }
  for(int i = 0; i < n; i++){
    for(int j = 0; j < K; j++){
      Tmp(i,j) = Res_sq(j,i)/Den(i);
    }  
  }
  scale = (nu*lambda)/(N + nu) + (1/(N + nu))*(sum(Tmp));
  for (int k = 0; k < K; k++){
  sigma(k) = ((N + nu)*scale(k))/(R::rchisq(N + nu));
  }

  return sigma;
}

当我从R:

运行时
sourceCpp('Docs/Bayes/update_s.cpp')

这是我得到的错误:

update_s.cpp:26:5: error: 'Thetasq' is not a member of 'arma'
update_s.cpp:26:33: error: 'Theta' is not a member of 'arma'
update_s.cpp:31:38: error: no matching function for call to 'trans(Rcpp::NumericMatrix&)'

我不知道为什么我会收到错误。通过查看在线教程,似乎将RcppArmadillo函数用于Rcpp的方法是使用:

arma::function();

这是对的吗?或者是否有其他方法可以使用它们。请告诉我。

谢谢,

纳波

0 个答案:

没有答案