犰狳中的 Rcpp 糖命令

Posted

技术标签:

【中文标题】犰狳中的 Rcpp 糖命令【英文标题】:Rcpp sugar commands in armadillo 【发布时间】: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 这里。但是好像没有。 【参考方案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]; elseres[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 谢谢,但你的回答与我的问题无关。

以上是关于犰狳中的 Rcpp 糖命令的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rcpp 通过引用传递犰狳稀疏矩阵

在犰狳矩阵中具有概率的矢量化 Rcpp rbinom

在rcpp犰狳中将向量与double进行比较

Rcpp 中的 lengths() 糖函数?

犰狳的 print() 方法和 cout 从 Rcpp 调用时的顺序不一致

犰狳矩阵列的非连续访问