繁体   English   中英

如何在rcpp中计算rowSums

[英]How to compute rowSums in rcpp

我正在将R函数转换为Rcpp,在那里我使用了R函数rowSums ,它似乎不是rowSums中的有效糖表达式。 我在这里找到了一个Rcpp版本的rowSums的代码。 但我得到了

错误:使用未声明的标识符

当我在主Rcpp函数中使用rowSumsC()时。

有一个简单的解决方案吗?

编辑:代码

cppFunction(
  "NumericMatrix Expcpp(NumericVector x, NumericMatrix w,
   NumericVector mu, NumericVector var, NumericVector prob, int k) {
   for (int i=1; i<k; ++i){
   w(_,i) = prob[i] * dnorm(x,mu[i], sqrt(var[i]));
   }
   w = w / rowSums(w)
   return w;
}")

Rcpp正式在0.12.8中添加了rowSum支持 因此,不需要使用Hadley在Advanced R中设计的rowSumsC函数。

话虽如此,代码存在一些问题。


目前RCPP 支持Matrix ,以VectorMatrix ,以Matrix计算。 (根据#583可以添加对后者的支持,但如果需要,可以考虑使用RcppArmadilloRcppEigen )。 因此,以下行存在问题:

w = w / rowSums(w)

为了解决这个问题,首先计算rowSums ,然后使用传统的for循环标准化矩阵。 注意:R不同,C ++中的循环非常快。

NumericVector summed_by_row = rowSums(w);

for (int i = 0; i < k; ++i) {
  w(_,i) = w(_,i) / summed_by_row[i];
}

接下来,C ++索引从0开始而不是1 因此,以下for循环是有问题的:

for (int i=1; i<k; ++i)

修复:

for (int i=0; i<k; ++i)

最后,可以减少函数的参数,因为某些值不相关或被覆盖。

函数声明来自:

NumericMatrix Expcpp(NumericVector x, NumericMatrix w,
   NumericVector mu, NumericVector var, NumericVector prob, int k)

至:

NumericMatrix Expcpp(NumericVector x, NumericVector mu, NumericVector var, NumericVector prob) {

  int n = x.size();
  int k = mu.size();
  NumericMatrix w = no_init(n,k); 

  .....

将上述所有反馈放在一起,我们就可以获得所需的功能。

Rcpp::cppFunction(
  'NumericMatrix Expcpp(NumericVector x, NumericVector mu, NumericVector var, NumericVector prob) {

  int n = x.size();
  int k = mu.size();

  NumericMatrix w = no_init(n,k); 

  for (int i = 0; i < k; ++i) { // C++ indices start at 0
     w(_,i) = prob[i] * dnorm(x, mu[i], sqrt(var[i]));
  }

  Rcpp::Rcout << "Before: " << std::endl << w << std::endl;

  NumericVector summed_by_row = rowSums(w);

  Rcpp::Rcout << "rowSum: " << summed_by_row << std::endl;

  // normalize by column to mimic R
  for (int i = 0; i < k; ++i) {
    w(_,i) = w(_,i) / summed_by_row[i];
  }

  Rcpp::Rcout << "After: " << std::endl << w << std::endl;

  return w;
  }')

set.seed(51231)
# Test values
n <- 2
x <- seq_len(n)
mu <- x
var <- x
prob <- runif(n)

mat <- Expcpp(x, mu, var, prob)

产量

Before: 
0.0470993 0.125384
0.0285671 0.160996

rowSum: 0.172483 0.189563
After: 
0.273066 0.661436
0.165623 0.849300

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM