犰狳中的 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.double
或as.data.frame
等类型。例如as.Numeric.Vector
这里。但是好像没有。
【参考方案1】:
使用犰狳的advanced constructors,您可以拥有引用相同内存位置的Rcpp::NumericVector
和arma::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 糖命令的主要内容,如果未能解决你的问题,请参考以下文章