【问题标题】:Rcpp sugar commands in armadillo犰狳中的 Rcpp 糖命令
【发布时间】:2018-07-27 06:42:44
【问题描述】:

我正在尝试将 Rcpp 糖的 ifelse() 命令与 arma::vec 一起使用。代码失败并出现错误

'ifelse' was not declared in this scope

我找不到解决方案。下面是一个简单的示例代码(导致错误)。

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

// [[Rcpp::export]]
arma::vec f(arma::vec x, arma::vec y) {
  arma::vec res1 = Rcpp::ifelse(x < y, x, y);
  arma::vec res = trans(res1)*y;
  return res;
}

/*** R
f(c(1,2,3),c(3,2,1))
*/

【问题讨论】:

  • 您需要使用Rcpp::ifelse,但这不适用于arma::vec
  • @F. Privé 我根据您的建议编辑了代码。有没有办法同时使用犰狳(用于矩阵计算)和 rcpp 糖?
  • 我不这么认为。 Rcpp 糖用于 Rcpp 类型。
  • C++ 是一种静态类型的面向对象语言。适用于一种类型(即Rcpp::NumericVector)的东西不一定适用于另一种类型(即arma::vec)。
  • 谢谢。我只是想知道是否有一些命令可以强制R 中的as.doubleas.data.frame 等类型。例如as.Numeric.Vector 这里。但是好像没有。

标签: r rcpp armadillo


【解决方案1】:

使用犰狳的advanced constructors,您可以拥有引用相同内存位置的Rcpp::NumericVectorarma::vec。然后,您可以通过为那块内存使用正确的前端对象来同时使用 Rcpp 函数和 arma 函数:

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

// [[Rcpp::export]]
arma::vec f(Rcpp::NumericVector xr, Rcpp::NumericVector yr) {
  arma::vec x(xr.begin(), xr.size(), false, true); 
  arma::vec y(yr.begin(), yr.size(), false, true);
  Rcpp::NumericVector res1r(xr.size());
  arma::vec res1(res1r.begin(), res1r.size(), false, true);  
  res1r = Rcpp::ifelse(xr < yr, xr, yr);
  arma::vec res = trans(res1)*y;
  return res;
}

/*** R
f(c(1,2,3),c(3,2,1))
*/

我不能 100% 确定这没有任何不良副作用。

【讨论】:

    【解决方案2】:

    这是我发现的解决方案,希望对您有用。

    #include <RcppArmadillo.h>
    
    // [[Rcpp::depends(RcppArmadillo)]]
    
    // [[Rcpp::export]]
    
    arma::vec f(arma::vec x, arma::vec y) {
      int n = x.size();
      arma::vec res(n); 
        for(int i = 0; i < n; i++){
          if (x[i] < y[i]){res[i] = x[i];} else{res[i] = y[i];}
      }
      return trans(res)*y;
    }
    

    输出是

    /*** R
    f(c(1,2,3),c(3,2,1))
    */
         [,1]
    [1,]    8
    

    【讨论】:

    • 请不要包含RcppArmadillo.h Rcpp.h。前者牵扯后者。你只需要一个,订单很重要。而且你展示的也是多余的。
    • 进行 Dirk 建议的更正,编辑我的答案。
    • @Rafael Diaz 谢谢,但你的回答与我的问题无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多